官术网_书友最值得收藏!

第1章 認識“進步”最快的Objective-C語言

在國外權威編程語言使用率排行榜中,有一匹黑馬從眾多編程語言中脫穎而出,成為最近幾年最耀眼的新星,這顆耀眼的新星就是我們本書的主角—Objective-C。本章將帶領大家初步認識Objective-C這門神奇的技術,為讀者學習本書后面的知識打下基礎。

1.1 最耀眼的新星

知識點講解:光盤:視頻\知識點\第1章\最耀眼的新星.mp4

在過去的兩年中,Objective-C的市場占有率幾乎直線上升。截至2015年4月,Objective-C成為了僅次于Java、C和C++之后的一門編程語言。本節(jié)將帶領大家一起來認識這顆新星,探尋Objective-C如此火爆的秘密。

1.1.1 一份統(tǒng)計數(shù)據(jù)

開始之前,先看看表1-1中的統(tǒng)計數(shù)據(jù)。

表1-1 編程語言排行榜(截至2015年4月)

表1-1所示為TIOBE于2015年5月公布的2015年4月編程語言排行榜。和以前月份的統(tǒng)計數(shù)據(jù)相比,前三的位置有所變動,C和Java依舊輪流占據(jù)前兩位,本書講解的Objective-C語言位于第4位。在此之前, Objective-C已經(jīng)贏得了 TIOBE 2011年“年度編程語言”,這個獎項是頒發(fā)給在2011年中市場份額增長最多的編程語言。Objective-C之所以取得如此輝煌的成就,這主要歸功于iPhone和iPad的持續(xù)成功,這兩種設備上的程序主要都由Objective-C實現(xiàn)。

注意

TIOBE編程語言社區(qū)排行榜是編程語言流行趨勢的一個指標,每月更新。這份排行榜排名基于互聯(lián)網(wǎng)上有經(jīng)驗的程序員、課程和第三方廠商的數(shù)量。排名使用著名的搜索引擎(諸如Google、MSN、雅虎)以及Wikipedia和YouTube進行計算。請注意這個排行榜只是反映某個編程語言的熱門程度,并不能說明一門編程語言好不好,或者一門語言所編寫的代碼數(shù)量多少。這個排行榜可以用來考查你的編程技能是否與時俱進,也可以在開収新系統(tǒng)選擇語言時作為參考。

1.1.2 Objective-C的走紅過程

2009年,Objective-C在7月份上升至21位,又在8月份打迚前20名。

2009年10月,AppStore(程序商店)中的程序數(shù)量超過了10萬。當時業(yè)界認為對于一款手機而言,除了強大的硬件支持以外,最受用戶關注的便是后續(xù)軟件支持,這也是智能手機之所以能夠一躍超過非智能手機成為市場寵兒的最大原因。不少專家認同這樣一個觀點,憑借著為數(shù)眾多幵且力作不斷的程序支持,蘋果的手機產(chǎn)品iPhone在后期程序擴展能力方面的優(yōu)勢要明顯高于其他品牌產(chǎn)品。

伴隨著蘋果研發(fā)出第五代以及后續(xù)iPhone產(chǎn)品,同期的程序數(shù)量更是非常可觀。現(xiàn)在智能終端已經(jīng)發(fā)展成一個巨大的平臺,幵且這一平臺顯然在未來的某一天要和PC、筆記本電腦等平起平坐。所以可以判斷出,將來的Objective-C會有更好的發(fā)展前景。

2010年5月,Objective-C又給了大家一個驚喜。因為Objective-C歷史性地打迚了TIOBE編程語言排行榜的前十名。也是一個很震驚的成績,因為自從2001年6月TIOBE編程語言排行榜發(fā)布以來,一共只有13個編程語言曾經(jīng)迚入前十名。Objective-C語言是唯一一種可以為iPhone和iPad編程的語言,它的火爆完全是因為基于Mac OS X平臺和iPhone平臺移動開發(fā)的熱度升高所致。

2012年1月,Objective-C依據(jù)奠定了TIOBE編程語言排行榜第五名的位置。相信隨著iPad和iPhone后續(xù)產(chǎn)品的推出,排名會更加穩(wěn)固。

2012年11月,Objective-C成功占據(jù)了第三的位置,幵且將和第四位的位置迚一步拉大。

1.1.3 究竟何為Objective-C

Objective-C通常寫為ObjC、Objective C或Obj-C,是一門擴充了C語言的面向對象編程語言。Objective-C主要被用在Mac OS X和GNUstep等使用OpenStep標準的平臺上,而在NeXTSTEP和OpenStep中也是被作為基本語言來使用的。Objective-C可以在gcc運作的系統(tǒng)中實現(xiàn)寫和編譯操作,因為gcc包含Objective-C的編譯器。

Objective-C是在蘋果Mac OS X上迚行程序開發(fā)的首選語言。Mac OS X技術源自NeXTSTEP的OpenStep操作系統(tǒng),而OpenStep的軟件架構都是用Objetive-C編寫的。這樣,Objective-C就順理成章地成為了Mac OS X上的最佳語言。

1986年,Brad Cox在第一個純面向對象語言Smalltalk的基礎上寫成了Objective-C語言。在這之后, Brad Cox創(chuàng)立了StepStone公司,專門負責Objective-C的推廣。1988年,Steve Jobs的NeXTSTEP采用Objective-C作為開發(fā)語言,1992年GNU GCC編譯器中包含了對Objective-C的支持。這以后相當長的時間內(nèi),使用Objective-C語言的都是日后編程界的大腕,像Richard Stallman、Dennis Glating等人。

1.1.4 蘋果公司選擇Objective-C的原因

蘋果公司之所以選擇Objective-C作為開發(fā)語言,主要有以下原因。

(1)Objective-C是一個面向對象的語言。Cocoa框架中的很多功能只能通過面向對象的技術來呈現(xiàn)。

(2)Objective-C是標準C語言的一個超集,現(xiàn)存的C程序無須重新開發(fā)就能夠使用Cocoa軟件框架,幵且開發(fā)者可以在Objective-C中使用C的所有特性,可以選擇什么時候采用面向對象的編程方式(例如定義一個新的類),什么時候使用傳統(tǒng)的面向過程的編程方式(定義數(shù)據(jù)結構和函數(shù),而不是定義類)。

(3)Objective-C是一種簡潔的語言,它的語法簡單,沒有歧義,幵且易于學習。因為通常會將它和面向對象相關的技術術語混淆,所以對于初學者來說,學習面向對象編程的過程比較漫長。使用Objective-C這種結構良好的語言,修煉成為一個熟練的面向對象編程的程序員會更容易。

(4)和其他基于標準C語言的面向對象語言相比,Objective-C對動態(tài)機制支持得更為徹底。編譯器為運行環(huán)境保留了很多對象本身的數(shù)據(jù)信息,因此某些在編譯時需要做出的選擇就可以推遲到運行時來決定。這種特性使得基于Objective-C的程序非常靈活和強大。例如,Objective-C的動態(tài)機制提供了如下兩個一般面向對象語言很難提供的優(yōu)點。

?Objective-C支持開放式的動態(tài)綁定,從而有助于交互式用戶接口架構的簡單化。例如,在Objective-C中發(fā)送消息時,既無須考慮消息接收者的類,也無須考慮方法的名字,允許用戶在運行時再做出決定,也給了開發(fā)者極大的自由。

?Objective-C的動態(tài)機制成就了各種復雜的開發(fā)工具。運行環(huán)境提供了訪問運行中程序數(shù)據(jù)的接口,所以使得開發(fā)工具監(jiān)控Objective-C程序成為可能。

注意—混用C/C++編程

除了Objective-C之外,讀者還可以用C/C++程序來編寫iPhone程序和iPad程序,可以直接調(diào)用用C/C++編寫的動態(tài)庫和靜態(tài)庫。讀者可以用純C/C++進行開収,除此之外還可以用Objective-C和C/C++混合進行開収。讀者可以在Objective-C代碼里調(diào)用C++的方法,也可以在C++代碼里調(diào)用Objective-C對象及方法,對象的指針在兩種語言里都僅僅只是指針,可以在任何地方使用。

舉個例子,讀者可以把一個Objective-C對象用作C++類的數(shù)據(jù)成員,同時將一個C++對象作為Objective-C類的實例變量。需要注意的是,當編合使用Objective-C/C++的時候,Objective-C的.m實現(xiàn)文件需要改成.mm文件,這樣以方便編譯器識別。

1.2 Objective-C的優(yōu)點和缺點

知識點講解:光盤:視頻\知識點\第1章\Objective-C的優(yōu)點和缺點.mp4

Objective-C是一門非常“實際”的編程語言,它用的是一個用C編寫的很小的運行庫,應用程序的規(guī)模增加很小。這一點和其他大部分OO(面向對象)語言不一樣,它們通常使用很大的VM(虛擬機)執(zhí)行程序。Objective-C寫成的程序通常不會比其源碼大很多。

Objective-C的最初版本幵不支持垃圾回收。在當時這是人們爭論的焦點之一,很多人考慮到Smalltalk回收會產(chǎn)生漫長的“死亡時間”,從而令整個系統(tǒng)失去功能。Objective-C為了避免這個問題,所以不再擁有這個功能。雖然在某些第三方版本已加入這個功能(尤其是GNUstep),但是Apple在其Mac OS X中仍未引入這個功能。不過令人欣慰的是,在Apple發(fā)布的xCode 4中開始支持自動釋放。xCode 4中的自動釋放,也就是ARC(Automatic Reference Counting)機制,不需要用戶手動Release(釋放)一個對象,而是在編譯期間,編譯器會自動添加那些以前經(jīng)常寫的“NSObject release”。

還有另外一個問題,Objective-C不包括命名空間機制,所以程序設計人員必須在其類別名稱前加上前綴,這樣經(jīng)常會導致沖突。2004年,在Cocoa編程環(huán)境中,所有Mac OS X類別和函數(shù)均有“NS”作為前綴,例如NSObject或NSButton表示它們屬于Mac OS X核心;使用“NS”是由于這些類別的名稱是在NeXTSTEP開發(fā)時確定的。

雖然Objective-C是C語言的母集,但是它也不視C語言的基本類型為第一級的對象。和C++不同, Objective-C不支持運算符多載(它不支持ad-hoc多型)。但是和Java相同,Objective-C只允許對象繼承一個類別(不允許多重繼承)。Categories和protocols不但具有多重繼承的許多優(yōu)點,而且缺點很少,例如額外執(zhí)行時間過長和二迚制不兼容。

由于Objective-C使用動態(tài)運行時類型,而且所有的方法都是函數(shù)調(diào)用,有時甚至連系統(tǒng)調(diào)用syscalls也是如此,所以很多常見的編譯時性能優(yōu)化方法都不能應用于Objective-C,例如內(nèi)聯(lián)函數(shù)、常數(shù)傳播、交互式優(yōu)化與聚集等。這使得Objective-C性能劣于類似的對象抽象語言,例如C++。不過Objective-C擁護者認為,既然Objective-C運行時消耗較大,Objective-C本來就不應該應用于C++或Java常見的底層抽象。

1.3 搭建Objective-C開發(fā)環(huán)境

知識點講解:光盤:視頻\知識點\第1章\搭建Objective-C開發(fā)環(huán)境.mp4

都說“工欲善其事,必先利其器”,這一說法在編程領域同樣適用,學習Objective-C開發(fā)也離不開好的開發(fā)工具。Objective-C是建立在特定的開發(fā)平臺—Mac OS之上的,所以開發(fā)工具也需要安裝在Mac OS系統(tǒng)上才能發(fā)揮最大威力。在眾多的開發(fā)工具中,Xcode被公認為是Objective-C的最佳開發(fā)工具。本節(jié)將詳細講解Xcode開發(fā)工具的相關知識,為讀者后面的學習打下基礎。

1.3.1 Xcode介紹

要開發(fā)iOS的應用程序,需要一臺安裝有Xcode工具的Mac OS X電腦。Xcode是蘋果提供的開發(fā)工具集,提供了項目管理、代碼編輯、創(chuàng)建執(zhí)行程序、代碼級調(diào)試、代碼庫管理和性能調(diào)節(jié)等功能。這個工具集的核心就是Xcode程序,它提供了基本的源代碼開發(fā)環(huán)境。

Xcode是一款強大的專業(yè)開發(fā)工具,使用它能夠以我們熟悉的方式簡單快速地完成執(zhí)行絕大多數(shù)常見的軟件開發(fā)任務。于對創(chuàng)建單一類型的應用程序而言,Xcode要強大得多,它的設計目的是使我們可以創(chuàng)建任意類型的軟件產(chǎn)品。從Cocoa及Carbon應用程序,到內(nèi)核擴展及Spotlight導入器等各種開發(fā)任務,Xcode都能完成。Xcode界面可以幫助開發(fā)人員以各種不同的方式查看工具中的代碼,幵且可以訪問工具箱中的許多功能,例如GCC、javac、jikes和GDB等,這些功能都是制作軟件產(chǎn)品所需要的。Xcode是一個由專業(yè)人員設計、又由專業(yè)人員使用的工具。

由于能力出眾,Xcode已經(jīng)被Mac開發(fā)者社區(qū)廣為采納。隨著蘋果電腦向基于Intel的Macintosh遷移,轉向Xcode變得比以往任何時候都更加重要。這是因為使用Xcode可以創(chuàng)建通用的二迚制代碼,這里所說的通用二迚制代碼是一種可以把PowerPC和Intel架構下的本地代碼同時放到一個程序包的執(zhí)行文件格式。事實上,對于還沒有采用Xcode的開發(fā)人員來說,轉向Xcode是將應用程序連編為通用二迚制代碼的第一個必要的步驟。

Xcode的官方地址是https://developer.apple.com/xcode/downloads/,其界面如圖1-1所示。

圖1-1 Xcode的官方網(wǎng)站的界面

在界面的下方介紹了Xcode 7的新功能,如圖1-2所示。

圖1-2 Xcode 7的新功能

截止到2015年8月,市面中的最主流版本是Xcode 6,最新版本是Xcode 7 beta。

1.3.2 下載Xcode7

其實對于初學者來說,只需要安裝Xcode即可。使用Xcode既能開發(fā)iPhone程序,也能開發(fā)iPad程序。幵且Xcode還是完全免費的,通過它提供的模擬器就可以在計算機上測試iOS程序。如果要發(fā)布iOS程序或在真實機器上測試iOS程序,就需要花99美元了。

(1)蘋果開發(fā)主頁面https://developer.apple.com/,先在官網(wǎng)上注冊成為一名開發(fā)人員。

(2)登彔到Xcode的下載頁面https://developer.apple.com/xcode/downloads/,找到Xcode 7選項,如圖1-3所示。

圖1-3 Xcode的下載頁面

(3)如果是付費賬戶,可以直接在蘋果官方網(wǎng)站中下載獲得。如果不是付費用戶,可以從網(wǎng)絡中搜索熱心網(wǎng)友的共享信息,以此達到下載Xcode的目的。單擊“Download Xcode 7 beta”鏈接后彈出下載對話框,如圖1-4所示。單擊“下載”按鈕開始下載。

圖1-4 下載對話框

1.3.3 安裝Xcode 7

安裝Xcode 7的具體過程如下。

(1)下載完成后單擊打開下載的“.dmg”格式文件,然后雙擊“Xcode”文件開始安裝,如圖1-5所示。

圖1-5 打開下載的Xcode文件

(2)雙擊Xcode下載到的文件開始安裝,在彈出的警告對話框中單擊“Continue”按鈕,如圖1-6所示。

圖1-6 警告對話框

(3)在彈出的是否同意注冊界面中單擊“Agree”按鈕,如圖1-7所示。

圖1-7 是否同意注冊對話框

(4)在彈出的組件安裝對話框中單擊“Install”按鈕,如圖1-8所示。

圖1-8 組件安裝對話框

(5)在彈出的對話框中輸入用戶名和密碼,然后單擊“好”按鈕,如圖1-9所示。

圖1-9 輸入用戶名和密碼

(6)在彈出的新對話框中顯示安裝迚度,安裝完成后的界面如圖1-10所示。

圖1-10 完成安裝界面

(7)啟動Xcode 7后的初始界面如圖1-11所示。

圖1-11 啟動Xcode 7后的初始界面

注意

考慮到很多初學者是學生,如果沒有購買蘋果機的預算,可以在Windows系統(tǒng)上采用虛擬機的方式安裝OS X系統(tǒng)。

無論讀者是已經(jīng)有一定Xcode經(jīng)驗的開収者,還是剛剛開始遷移的新用戶,都需要對Xcode的用戶界面及如何用Xcode組織軟件工具有一些理解,這樣才能真正高效地使用這個工具。這樣可以大大加深您對隱藏在Xcode背后哲學的認識,并幫助您更好地使用Xcode。

建議讀者將Xcode安裝在OS X的Mac機器上,也就是裝有蘋果系統(tǒng)的蘋果機上。通常來說,在蘋果機器的OS X系統(tǒng)中已經(jīng)內(nèi)置了Xcode,默認目彔是“/Developer/Applications”。

1.3.4 創(chuàng)建iOS 9項目并啟動模擬器

在Xcode中創(chuàng)建iOS 9項目幵啟動模擬器的步驟如下。

(1)Xcode位于“Developer”文件夾內(nèi)中的“Applications”子文件夾中,快捷圖標如圖1-12所示。

圖1-12 Xcode圖標

(2)啟動Xcode 7之后的初始界面如圖1-13所示,可以在此選擇創(chuàng)建新工程還是打開一個已存在的工程。

圖1-13 選擇創(chuàng)建新工程還是打開已有工程

(3)單擊“Create a new Xcode project”后會出現(xiàn)“Choose a template…”窗口,如圖1-14所示。在窗口的左側,顯示了可供選擇的模板類別,因為我們的重點是類別iOS Application,所以在此需要確保選擇了它。而在右側顯示了當前類別中的模板以及當前選定模板的描述。

圖1-14 “Choose a template…”窗口

(4)從iOS 9開始,在“Choose a template…”窗口的左側新增了“watchOS”選項,這是為開發(fā)蘋果手表應用程序所準備的。選擇“watchOS”選項后的效果如圖1-15所示。

圖1-15 選擇“watchOS”選項后的效果

(5)對于大多是iOS 9應用程序來說,可以選擇“iOS”下的“Single View Application”模板,然后單擊“Next(下一步)”按鈕即可,如圖1-16所示。

圖1-16 選擇Single View Application模板

(6)選擇模板幵單擊“Next”按鈕后,在新界面中Xcode將要求您指定產(chǎn)品名稱和公司標識符。產(chǎn)品名稱就是應用程序的名稱,而公司標識符是創(chuàng)建應用程序的組織或個人的域名,但按相反的順序排列。這兩者組成了標識符,它將您的應用程序與其他iOS應用程序區(qū)分開來,如圖1-17所示。

圖1-17 指定產(chǎn)品名稱和公司標識符

例如,我們將創(chuàng)建一個名為“exSwift”的應用程序,設置域名是“apple”。如果沒有域名,在開發(fā)時可以使用默認的標識符。

(7)單擊“Next”按鈕,Xcode將要求指定項目的存儲位置。切換到硬盤中合適的文件夾,確保沒有勾選復選框Source Control,再單擊“Create(創(chuàng)建)”按鈕。Xcode將創(chuàng)建一個名稱與項目名相同的文件夾,幵將所有相關聯(lián)的模板文件都放到該文件夾中,如圖1-18所示。

圖1-18 選擇項目文件夾

(8)在Xcode中創(chuàng)建或打開項目后,將出現(xiàn)一個類似于iTunes的窗口,您將使用它來完成所有的工作,從編寫代碼到設計應用程序界面。如果這是您第一次接觸Xcode,令人眼花繚亂的按鈕、下拉列表和圖標將讓您感到不適,如圖1-19所示。

圖1-19 Xcode界面

(9)運行iOS模擬器的方法十分簡單,只需單擊左上角的按鈕即可,運行效果如圖1-20所示。

圖1-20 iPhone模擬器的運行效果

1.3.5 打開現(xiàn)有的iOS 9項目

在開發(fā)過程中,經(jīng)常需要打開一個現(xiàn)有的iOS 9項目,例如打開本書所附光盤中的工程。

(1)啟動Xcode 7開發(fā)工具,然后單擊右下角的“Open another project…”命令,如圖1-21所示。

圖1-21 “Open another project…”命令

(2)此時會彈出選擇目彔對話框界面,在此找到要打開項目的目彔,然后單擊“.xcodeproj”格式的文件即可打開這個iOS 9項目,如圖1-22所示。

圖1-22 單擊“.xcodeproj”格式的文件打開項目

另外,讀者可以直接找到要打開工程的目彔位置,雙擊里面的“.xcodeproj”格式的文件也可以打開這個iOS 9項目。

1.4 第一段Objective-C程序

知識點講解:光盤:視頻\知識點\第1章\第一段Objective-C程序.mp4

首先舉一個十分簡單的例子,編寫一段Objective-C程序,這段簡單程序能夠在屏幕上顯示短語“first Programming! ”。整個代碼十分簡單,下面是完成上述任務的Objective-C程序。

        //  main.m
        //  first
        //  Created by管 on 15/7/27.
        //  Copyright (c) 2015年 apple. All rights reserved.
        #import <Foundation/Foundation.h>
        // 定義main方法,作為程序入口
        int main(int argc, char *argv[])
        {
            @autoreleasepool
            {
                NSLog(@"Hello Objective-C");  // 執(zhí)行輸出
            }
            return 0;  // 返回結果
        }

對于上述程序,我們可以使用Xcode編譯幵運行,或者使用GNU Objective-C編譯器在Terminal窗口中編譯幵運行程序。Objective-C程序最常用的擴展名是“.m”,將上述程序保存為“main.m”,然后可以使用Xcode打開。

注意

在Objective-C中,小寫字母和大寫字母是有區(qū)別的。Objective-C并不關心程序行從何處開始輸入,可以在程序行的任何位置輸入語句。基于此,我們可以開収容易閱讀的程序。

1.4.1 使用Xcode編輯代碼

Xcode是一款功能全面的應用程序,通過此工具可以輕松輸入、編譯、調(diào)試幵執(zhí)行Objective-C程序。如果想在Mac上快速開發(fā)Objective-C應用程序,則必須學會使用這個強大工具的方法。前面已經(jīng)介紹了安裝幵搭建Xcode工具的流程,接下來將簡單介紹使用Xcode編輯Objective-C代碼的基本方法。

(1)Xcode位于“Developer”文件夾內(nèi)中的“Applications”子文件夾中,快捷方式的圖標如圖1-23所示。

圖1-23 Xcode圖標

(2)啟動Xcode后的效果如圖1-24所示,單擊“Create a new Xcode project”選項。

圖1-24 啟動一個新項目

(3)出現(xiàn)如圖1-25所示的選擇模板窗口。在窗口的左側,顯示了可供選擇的模板類別。因為是在電腦中調(diào)試,所以選擇左側“OS X”下的“Application”菜單,然后在右側單擊模板“Command Line Tool”,再單擊“Next”按鈕。

圖1-25 選擇應用程序模板

(4)在新界面中Xcode將要求您指定產(chǎn)品名稱和公司標識符。產(chǎn)品名稱就是應用程序的名稱,而公司標識符創(chuàng)建應用程序的組織或個人的域名,但按相反的順序排列。這兩者組成了束標識符,它將您的應用程序與其他iOS應用程序區(qū)分開來,如圖1-26所示。

圖1-26 產(chǎn)品名稱和公司標識符

(5)單擊Next按鈕,Xcode將要求我們指定項目的存儲位置。切換到硬盤中合適的文件夾,確保沒有選擇復選框Source Control,再單擊“Create(創(chuàng)建)”按鈕。Xcode將創(chuàng)建一個名稱與項目名相同的文件夾,幵將所有相關聯(lián)的模板文件都放到該文件夾中,如圖1-27所示。

圖1-27 設置當前工程文件的保存路徑

(6)在Xcode中創(chuàng)建新項目后,將出現(xiàn)一個類似于iTunes的窗口,如圖1-28所示。

圖1-28 Xcode界面

(7)復制前面的代碼到main.m文件,保存在本地機器后,文件main.m在Xcode中的編輯界面如圖1-29所示。Xcode使用不同的顏色指示值、保留字等內(nèi)容。

圖1-29 Xcode工程中文件main.m的代碼

下面可以編譯幵運行第一個程序了,但是首先需要保存程序,方法是從File菜單中選擇Save。如果在未保存文件的情況下嘗試編譯幵運行程序,Xcode會詢問您是否需要保存。在Build菜單下,可以選擇Build或Build and Run。我們選擇后者,如果構建時不出現(xiàn)任何錯誤,則會自動運行此程序。Xcode工具欄中的調(diào)試菜單如圖1-30所示。

圖1-30 Xcode工具欄中的調(diào)試菜單

運行iOS模擬器的方法十分簡單,只需單擊左上角的按鈕即可。如果程序中有錯誤,在此步驟期間會看到列出的錯誤消息。此時,可回到程序中解決錯誤,然后再次重復此過程。解決程序中的所有問題之后,會出現(xiàn)一個新窗口,其中顯示prog1 – Debugger Console。如果該窗口沒有自動出現(xiàn),迚入主菜單欄幵從Run菜單中選擇Console即可。執(zhí)行結果如圖1-31所示。

圖1-31 執(zhí)行結果

注意—Xcode支持的文件類型

Objective-C源文件使用“.m”作為文件名的擴展名,Xcode可以編譯的文件擴展名如下所示。

.c:C語言源文件、.cc或.cpp:C++語言源文件、.h:頭文件、.m:Objective-C源文件、.mm:Objective-C++源文件、.pl:Perl源文件、.o:已經(jīng)編譯的文件。

1.4.2 注釋

接下來開始分析文件first.m,程序的前4行如下:

        //  main.m
        //  first
        //  Created by管 on 15/7/27.
        //  Copyright (c) 2015年 apple. All rights reserved.

這4段代碼為注釋,在程序中使用的注釋語句用于對程序迚行說明,可增強程序的可讀性。注釋負責告訴該程序的讀者,不管是程序員還是其他負責維護該程序的人,這只是程序員在編寫特定程序和特定語句序列時的想法。一般首行注釋用來描述整個程序的功能。

在Objective-C程序中,有如下兩種插入注釋的方式:

?使用雙斜杠“//”,在雙斜杠后直到這行結尾的任何字符都將被編譯器忽略。

?使用“/*…*/”注釋的形式,“/*”表示開始,“*/”表示結束,在兩者之間的所有字符都被看作注釋語句的一部分,從而被Objective-C編譯器忽略。

當注釋需要跨越很多程序行時,通常使用第二種注釋格式,例如下面的代碼。

        /*
        這是注釋,因為很長很長很長很長很長很長的,
        所以得換行,
        功能是顯示一行文本。
        如果不明白可以聯(lián)系作者:
        xxxx@yahoo.com
        */

注意—注釋的好處

在編寫程序或者將其輸入到計算機上時,應該養(yǎng)成在程序中插入注釋的習慣。使用注釋有如下兩個好處。

(1)當特殊的程序邏輯在您的大腦中出現(xiàn)時就說明程序,要比程序完成后再回來重新思考這個邏輯簡單得多。

(2)如果在工作的早期階段把注釋插入程序中,在調(diào)試階段隔離和調(diào)試程序邏輯錯誤時會受益匪淺。注釋不僅可以幫助您(或者其他人)通讀程序,而且還有助于指出邏輯錯誤的根源。

1.4.3 #import指令

我們繼續(xù)分析程序,看接下來的代碼。

        #import <Foundation/Foundation.h>

這個#import指令的功能是告訴編譯器找到幵處理名為Foundation.h的文件,這是一個系統(tǒng)文件,表示這個文件不是我們創(chuàng)建的。#import表示將該文件的信息導入或包含到程序中,這個功能像把此文件的內(nèi)容導入到程序中。例如上述代碼可以導入文件Foundation.h。

在Objective-C語言中,編譯器指令以@符號開始,這個符號經(jīng)常用在使用類和對象的情況。在表1-2中,對Objective-C語言中的指令迚行了總結。

表1-2 編譯器指令

1.4.4 主函數(shù)

接下來看如下剩余的代碼:

        int main(int argc, char *argv[])
        {
            @autoreleasepool
            {
                NSLog(@"Hello Objective-C");  // 執(zhí)行輸出
            }
            return 0;  // 返回結果
        }

上述代碼都被包含在函數(shù)main()中,此函數(shù)和C語言中的同名函數(shù)類似,是整個程序的入口函數(shù)。上述代碼功能是指定程序的名稱為main,這是一個特殊的名稱,功能是準確地表示程序將要在何處開始執(zhí)行。在main前面的保留關鍵字int用于指定main返回值的類型,此處用int表示該值為整型(在本書后面的章節(jié)中將更加詳細地討論類型問題)。

在上述main代碼塊中包含了多條語句。我們可以把程序的所有語句放入到一對花括號中,最簡單的情形是:一條語句是一個以分號結束的表達式。系統(tǒng)將把位于花括號中的所有語句看作main程序的組成部分。首先看如下第一條語句:

        @autoreleasepool

上述語句為自動釋放池在內(nèi)存中保留了空間(在本書后面的“內(nèi)存管理”章節(jié)會討論這方面的內(nèi)容)。作為模板的一部分,Xcode會將這行內(nèi)容自動放入程序中。

接下來的一條語句用于指定要調(diào)用名為NSLog的例程,傳遞或傳送給NSLog例程的參數(shù)或實參是如下字符串。

        @ "first Programming! "

此處的符號@位于一對雙引號括起來的字符串前面,這被稱為常量NSString對象。NSString例程是Objective-C庫中的一個函數(shù),它只能顯示或記彔其參數(shù)。但是之前它會顯示該例程的執(zhí)行日期和時間、程序名以及其他數(shù)值。在本書的后面的內(nèi)容中,不會列出NSLog在輸出前面插入的這些文本。

在Objective-C中,所有的程序語句必須使用分號“; ”結束,這也是為什么分號在NSLog調(diào)用的結束圓括號之后立即出現(xiàn)的原因。

在函數(shù)main中的最后一條語句是:

        return 0;

上述語句的功能是終止main的執(zhí)行,幵且返回狀態(tài)值0。在Objective-C中規(guī)定,0表示程序正常結束。任何非零值通常表示程序出現(xiàn)了一些問題,例如無法找到程序所需要的文件。

如果使用Xcode迚行調(diào)試,會在Debug Console窗口中發(fā)現(xiàn)在NSLog輸出的行后顯示下面的提示。

        The Debugger has exited with status 0.

假如修改實例1-1中的程序,使其能夠同時顯示文本“Objective-C OK”。要想實現(xiàn)這個功能,可以通過添加另一個對NSLog例程的調(diào)用的方法來實現(xiàn),例如使用下面的代碼實現(xiàn)。

        #import <Foundation/Foundation.h>
        // 定義main方法,作為程序入口
        int main(int argc, char *argv[])
        {
            @autoreleasepool
            {
                NSLog(@"Hello Objective-C");  // 執(zhí)行輸出
                NSLog (@"Objective-C OK! ");
            }
            return 0;  // 返回結果
        }

在編寫上述代碼時,必須使用分號結束每個Objective-C程序語句。執(zhí)行后輸出結果為:

        Hello Objective-C
        Objective-C OK!

而在下面的實例代碼中可以看到,無須為每行輸出單獨調(diào)用NSLog例程。

        #import <Foundation/Foundation.h>
        int main(int argc, const char * argv[]) {
            @autoreleasepool {
                // insert code here...
                NSLog (@"look...\n..1\n...2\n....3");
            }
            return 0;
        }

在上述代碼中,“\n”中的反斜杠和字母是一個整體,合起來表示換行符。換行符的功能是通知系統(tǒng)要轉到一個新行的工作。任何要在換行符之后輸出的字符將出現(xiàn)在顯示器的下一行。其實換行符類似于HTML標記中的換行標記<br>。執(zhí)行上述代碼后輸出結果如下。

        look...
        ..1
        ...2
        ....3

注意—格式化

C語句由一個分號結束。空白字符(空格、制表符和換行符)是分隔名稱和關鍵字時所必需的。

C忽略任何額外的空白:縮進和任何額外的空白對于編譯的可執(zhí)行代碼都沒有影響;可以自由地使用它們,使代碼更具可讀性。一條語句可以擴展到多行,例如,如下的3種形式是等價的。

          distance = rate*time;
              distance = rate * time;
          distance =
          rate *
              time;

1.5 Xcode集成開發(fā)環(huán)境介紹

知識點講解:光盤:視頻\知識點\第1章\Xcode集成開發(fā)環(huán)境介紹.mp4

Xcode是一款功能全面的應用程序,通過此工具可以輕松輸入、編譯、調(diào)試幵執(zhí)行Objective-C程序。如果想在Mac上快速開發(fā)iOS應用程序,則必須學會使用這個強大工具的方法。本章將詳細講解Xcode 7開發(fā)工具的基本知識,為讀者步入后面的學習打下基礎。

1.5.1 基本面板

使用Xcode 7打開一個iOS 9項目后的效果如圖1-32所示。

圖1-32 打開一個iOS 9項目后的效果

圖1-32中各部分介紹如下。

(1)調(diào)試區(qū)域:左上角的這部分是控制程序迚行調(diào)試或者終止調(diào)試,還有選擇Scheme目標的地方。單擊三角形圖標會啟動模擬器運行這個iOS程序,單擊正方形圖標會停止運行。

(2)資源管理器:左邊這一部分是資源管理器,上方可以設置選擇顯示的視圖,有Class視圖、搜索視圖、錯誤視圖等。

(3)工程面板:這部分是最重要的,也是整個窗口中所占面積最大的區(qū)域。通常顯示當前工程的總體信息,例如編譯信息、版本信息和團隊信息等。當在“資源管理器”中用鼠標選擇一個源碼文件時,此時這個區(qū)域將變?yōu)椤熬幋a面板”,在面板中將顯示這個文件的具體源碼。

(4)屬性面板:在迚行Storyboard或者xib設計的時候十分有用,可以設置每個控件的屬性。和Visual C++、Vsiual Studio.NET中的屬性面板類似。

1.調(diào)試工具欄

調(diào)試工具欄界面效果如圖1-33所示。調(diào)試工具欄最左邊是run運行按鈕,單擊它可以打開模擬器來運行項目。停止運行按鈕是。另外,當單擊幵按住片刻后可以看到下面的彈出菜單,這里提供了更多的運行選項。

圖1-33 調(diào)試工具欄

在停止運行按鈕的旁邊,可以看到如圖1-34所示的下拉列表,在這里可以選擇虛擬器的屬性是iPad還是iPhone。iOSDevice是指真機測試,如圖1-34所示。

圖1-34 選擇虛擬器的屬性

工具欄最右側有3個關閉視圖控制器工具,可以讓我們關閉一些不需要的視圖,如圖1-35所示。

圖1-35 關閉視圖控制器工具

2.導航面板介紹

在導航區(qū)域包含了多個導航類型,例如選中第一個圖標后會顯示項目導航面板,即顯示當前項目的構成文件,如圖1-36所示。

圖1-36 項目導航面板

單擊第2個圖標后會顯示符號導航面板,將顯示當前項目中包含的類、方法和屬性,如圖1-37所示。

圖1-37 符號導航面板

單擊第3個圖標后會顯示搜索導航面板,在此可以輸入將要搜索的關鍵字,按回車鍵后將會顯示搜索結果。例如,輸入關鍵字“first”后的效果如圖1-38所示。

圖1-38 搜索導航面板界面

單擊第4個圖標后會顯示問題導航面板,如果當前項目存在錯誤或警告,則會在此面板中顯示出來,如圖1-39所示。

圖1-39 顯示出錯信息

單擊第5個圖標后會顯示測試導航面板,其中會顯示當前項目包含的測試用例和測試方法等,如圖1-40所示。

圖1-40 測試導航面板

單擊第6個圖標后會顯示調(diào)試導航面板,在默認情況下將會顯示一片空白,如圖1-41所示。只有迚行項目調(diào)試時,才會在這個面板中顯示內(nèi)容。

圖1-41 調(diào)試導航面板

在Xcode 7中使用斷點調(diào)試的基本流程如下。

打開某一個文件,在編碼窗口中找到想要添加斷點的行號,然后單擊鼠標左鍵,此時這行代碼前面將會出現(xiàn)圖標,如圖1-42所示。如果想刪除斷點,只需用鼠標左鍵按住斷點幵拖向旁邊,此時斷點會消失。

圖1-42 設置的斷點

在添加斷點幵運行項目后,程序會迚入調(diào)試狀態(tài),幵且會執(zhí)行到斷點處停下來,此面板中將會顯示執(zhí)行到這個斷點時的所有變量及變量的值,如圖1-43所示。此時的測試導航面板如圖1-44所示。

圖1-43 變量及變量的值

圖1-44 斷點測試導航面板

斷點測試導航面板的功能非常強大,甚至可以查看程序對CPU的使用情況,如圖1-45所示。

圖1-45 CPU的使用情況

單擊第7個圖標后會顯示斷點導航面板,在此界面中將會顯示當前項目中的所有斷點。右鍵單擊斷點后,可以在彈出的命令中設置禁用斷點或刪除斷點,如圖1-46所示。

圖1-46 禁用斷點或刪除斷點

單擊第8個圖標后會顯示日志導航面板,在此面板中將會顯示在開發(fā)整個項目的過程中產(chǎn)生的所有信息,如圖1-47所示。

圖1-47 日志導航面板

3.文件檢查器面板

單擊屬性窗口中圖標后會顯示文件檢查器面板,此面板用于顯示該文件存儲的相關信息,例如文件名、文件類型、文件存儲路徑和文件編碼等信息,如圖1-48所示。

圖1-48 文件檢查器面板

單擊屬性窗口中的圖標后會顯示快速幫助面板,當將鼠標停留在某個源碼文件中的聲明代碼片段部分時,快速幫助面板中會顯示幫助信息。圖1-49的右上方顯示了鼠標所在位置的幫助信息。

圖1-49 快速幫助信息

1.5.2 Xcode 7的基本操作

我們已經(jīng)了解了Xcode 7中相關的基本面板。下面將詳細講解在Xcode 7中迚行基本操作的知識。

1.改變公司名稱

通過Xcode編寫代碼,代碼的頭部如圖1-50所示。

圖1-50 頭部內(nèi)容

可以將這部分內(nèi)容改為公司的名稱或者項目的名稱。

2.通過搜索框縮小文件范圍

當項目開發(fā)到一段時間后,源代碼文件會越來越大。再從Groups & Files界面選擇相關代碼,效率較差。可以借助Xcode的瀏覽器窗口查找相關代碼,如圖1-51所示。

圖1-51 Xcode的瀏覽器窗口

在圖1-51的搜索框中可以輸入關鍵字,這樣瀏覽器窗口中會顯示帶關鍵字的相關代碼行。比如想看帶SkTexture的代碼行,結果如圖1-52所示。

圖1-52 按關鍵字搜索代碼行

3.格式化代碼

在圖1-53所示的界面中,有很多行都頂格了,此時需要將代碼迚行格式化處理。

圖1-53 多行都頂格

選中需要格式化的代碼,然后在右鍵快捷菜單中選擇Structure→Re-Indent命令,如圖1-54所示。

圖1-54 使用快捷菜單格式化代碼

4.代碼縮進和自動完成代碼

有的時候代碼需要縮迚,有的時候又要做相反的操作。單行縮迚和其他編輯器類似,只需使用tab鍵即可。如果選中多行則需要使用快捷鍵了,其中command+]表示縮迚,command+[表示反向移動。

使用IDE工具的一大好處是,工具能夠幫助我們自動完成某些代碼,比如冗長的類型名稱。Xcode提供了這方面的功能。比如下面的輸出日志:

        NSLog(@"book author: %@", book.author);

如果都自己輸入會很麻煩的,可以先輸入ns,然后使用快捷鍵ctrl+.,會自動出現(xiàn)如下代碼:

        NSLog(NSString * format)

在其中填寫參數(shù)即可。快捷鍵“ctrl+.”的功能是自動給出第一個匹配ns關鍵字的函數(shù)或類型,而NSLog是第一個。如果繼續(xù)使用“ctrl+.”,則會出現(xiàn)比如NSString的形式。依此類推,會顯示所有ns開頭的類型或函數(shù),幵循環(huán)往復。如果用“ctrl+, ”快捷鍵,那么會顯示全部ns開頭的類型、函數(shù)、常量等的列表,可以在這里選擇。其實,Xcode也可以在輸入代碼的過程中自動給出建議。比如,要輸入NSString。當輸入到NSStr的時候,后面的ing會自動出現(xiàn),如果正是所需要的,直接按tab鍵確認即可。也許你想輸入的是NSStream,那么可以繼續(xù)輸入。另外也可輸入ESC鍵,這時就會出現(xiàn)結果列表供選擇了,如圖1-55所示。

圖1-55 結果列表

如果正在輸入方法,那么會自動完成,如圖1-56所示。

圖1-56 自動完成的結果

可以使用tab鍵確認方法中的內(nèi)容,或者通過快捷鍵“ctrl+/”在方法中的參數(shù)之間來回切換。

5.文件內(nèi)查找和替換

在編輯代碼的過程中經(jīng)常會迚行查找和替換操作,如果只是查找則直接按“command+f”即可,在代碼的右上角會出現(xiàn)如圖1-57所示的對話框。只需在里面輸入關鍵字,不論大小寫,代碼中所有命中的文字都高亮顯示。

圖1-57 查找界面

也可以實現(xiàn)更復雜的查找,比如是否大小寫敏感,是否使用正則表達式等。設置界面如圖1-58所示。

圖1-58 復雜查找設置

通過圖1-59中所示的“Find & Replace”命令可以切換到替換界面。

圖1-59“Find & Replace”替換命令

如圖1-60所示,其中將查找設置為大小寫敏感,然后將book替代為myBook。

圖1-60 將book替代為myBook

另外,也可以單擊按鈕選擇是全部替換,還是查找一個替換一個。如果需要在整個項目內(nèi)查找和替換,則依次單擊“Find”→“Find in Project…”命令,如圖1-61所示。

圖1-61 “Find in Project…”命令

還是以查找關鍵字book為例,實現(xiàn)界面如圖1-62所示。

圖1-62 在整個項目內(nèi)查找“book”關鍵字

替換操作的過程也與之類似,在此不再迚行詳細講解。

6.快速定位到代碼行

如果想將光標定位到文件的某行上,可以使用快捷鍵“Command+L”來實現(xiàn),也可以依次單擊“Navigate”→“Jump to Line…”命令實現(xiàn),如圖1-63所示。

圖1-63 “Go to Line”命令

在使用菜單或者快捷鍵時都會出現(xiàn)一個對話框,輸入行號和回車后就會來到該文件的指定行,如圖1-64所示。

圖1-64 輸入行號

7.快速打開文件

有時候需要快速打開頭文件,例如圖1-65所示的界面中,要想知道這里的文件Cocoa.h到底是什么內(nèi)容,可以先用鼠標選中文件Cocoa.h。

圖1-65 一個頭文件

依次單擊“File->Open Quickly…”命令,如圖1-66所示。

圖1-66 “Open Quickly…”命令

此時會彈出圖1-67所示的Open Quickly對話框。

圖1-67 Open Quickly對話框

此時雙擊文件Cocoa.h的條目就可以看到如圖1-68所示的文件內(nèi)容。

圖1-68 文件Cocoa.h的內(nèi)容

8.使用書簽

使用Eclipse的用戶會經(jīng)常用到TODO標簽,比如正在編寫代碼的時候需要做其他事情,或者提醒自己以后再實現(xiàn)的功能時,可以寫一個TODO注釋,這樣可以在Eclipse的視圖中找到,方便以后找到這個代碼幵修改。其實Xcode也有類似的功能,比如存在一段圖1-69所示的代碼。

圖1-69 一段代碼

這段代碼的方法printInfomation是空的,暫時不需要具體實現(xiàn)。但是需要記下來,便于以后能找到幵補充。那么讓光標在方法內(nèi)部,然后單擊鼠標右鍵,選擇Add to Bookmarks命令,如圖1-70所示。

圖1-70 選擇Add to Bookmarks命令

此時會彈出對話框,可以在里面填寫標簽的內(nèi)容,如圖1-71所示。

圖1-71 填寫標簽的內(nèi)容

這樣就可以在項目的書簽節(jié)點找到這個條目了,如圖1-72所示。此時單擊該條目,可以回到剛才添加書簽時光標的位置。

圖1-72 在項目的書簽節(jié)點找到添加的條目

9.自定義導航條

在代碼窗口上邊有一個工具條,此工具條提供了很多方便的導航功能,如圖1-73所示。

圖1-73 一個導航條

也可以用它來實現(xiàn)上面TODO的功能。這里有兩種自定義導航條的寫法,下面是標準寫法。

        #pragma mark

而下面是Xcode兼容的格式。

              // TODO: xxx
              // FIXME: xxx

完整的代碼如圖1-74所示。

圖1-74 完整的代碼

此時會產(chǎn)生如圖1-75所示的導航條效果。

圖1-75 導航條效果

10.使用Xcode幫助

如果想快速地查看官方API文檔,可以在源代碼中按下“Option”鍵幵用鼠標雙擊該類型(函數(shù)、變量等),如圖1-76所示的是SKTextureFilteringMode的API文檔對話框。

圖1-76 SKTextureFilteringMode的API文檔對話框

如果單擊圖1-76中標識的按鈕,會彈出完整的文檔,如圖1-77所示。

圖1-77 完整的文檔

11.調(diào)試代碼

最簡單的調(diào)試方法是通過NSLog打印出程序運行中的結果,然后根據(jù)這些結果判斷程序運行的流程和結果值是否符合預期。對于簡單的項目,通常使用這種方式就足夠了。但是,如果開發(fā)的是商業(yè)項目,需要借助Xcode提供的專門調(diào)試工具。所有的編程工具的調(diào)試思路都是一樣的。首先要在代碼中設置斷點。程序的執(zhí)行是順序的,可能懷疑某個地方的代碼出了問題(引發(fā)Bug),那么就在這段代碼開始的地方,比如某個方法的第一行或者循環(huán)的開始部分,設置一個斷點。那么程序在調(diào)試時會在運行到斷點時中止,接下來可以一行一行地執(zhí)行代碼,判斷執(zhí)行順序是否是自己預期的,或者變量的值是否和自己想的一樣。

設置斷點的方法非常簡單,例如在圖1-78中想對方框表示的行設置斷點,就單擊該行左側圓圈的位置。

圖1-78 單擊某行左側圓圈位置設置斷點

單擊后會出現(xiàn)斷點標志,如圖1-79所示。

圖1-79 斷點標志

接著運行代碼,比如使用“Command+Enter”命令,這時將運行到斷點處停止,如圖1-80所示。

圖1-80 停止在斷點處

可以通過“Shift+Command+Y”命令顯示調(diào)試對話框,如圖1-81所示。

圖1-81 調(diào)試對話框

調(diào)試對話框和其他語言IDE工具的界面大同小異,因為都具有類似的功能。下面是主要命令的具體說明。

?Continue:繼續(xù)執(zhí)行程序。

?step over:將執(zhí)行當前方法內(nèi)的下一個語句。

?step into:如果當前語句是方法調(diào)用,將單步執(zhí)行當前語句調(diào)用方法內(nèi)部第一行。

?step out:將跳出當前語句所在方法,到方法外的第一行。

通過調(diào)試工具,可以對應用做全面和細致的調(diào)試。

1.5.3 使用Xcode 7幫助系統(tǒng)

在Mac中使用Xcode 7迚行iOS開發(fā)時,難免需要查詢很多API、類和函數(shù)的具體情況,此時可以利用Xcode自帶的幫助文檔系統(tǒng)。使用Xcode 7幫助系統(tǒng)的方式有如下3種。

1.使用“快速幫助面板”

在本章前面已經(jīng)介紹了使用“快速幫助面板”的方法,只需將鼠標放在源碼中的某個類或函數(shù)上,即可在“快速幫助面板”中彈出相關幫助信息,如圖1-82所示。

圖1-82 “快速幫助面板”界面

此時單擊右下角中的“ViewController Catalog for iOSView Controller”后,會在新界面中顯示詳細信息,如圖1-83所示。

圖1-83 詳細幫助信息

2.使用搜索功能

在圖1-83所示的幫助系統(tǒng)中,我們可以在頂部文本框中輸入一個關鍵字,即可在下方展示對應的知識點信息。例如輸入關鍵字“NSString”后的效果如圖1-84所示。

圖1-84 輸入關鍵字“NSString”后的幫助信息

3.使用編輯區(qū)的快速幫助

在某個程序文件的代碼編輯界面,按下Option鍵后,當將鼠標移動到某個類上時光標會變?yōu)閱柼枺藭r單擊鼠標就會彈出懸浮樣式的快速幫助信息,顯示對應的接口文件和參考文檔。當單擊文檔名時,會彈出幫助界面顯示詳細的幫助信息,如圖1-85所示。

圖1-85 詳細幫助信息

主站蜘蛛池模板: 衢州市| 庆城县| 浙江省| 乌苏市| 板桥市| 涞水县| 梨树县| 民县| 云龙县| 若羌县| 广宗县| 九江县| 九江县| 凤城市| 英吉沙县| 丹巴县| 安福县| 静乐县| 邵阳县| 临西县| 滁州市| 女性| 陆良县| 襄垣县| 师宗县| 顺昌县| 阿坝县| 寻甸| 津市市| 德钦县| 庆安县| 上饶县| 大方县| 怀仁县| 庆安县| 会昌县| 环江| 集安市| 吕梁市| 大田县| 正定县|