1. 程式人生 > >iOS開發60分鐘入門

iOS開發60分鐘入門

本文面向已有其它語言(如Java,C,PHP,Javascript)程式設計經驗的iOS開發初學者,初衷在於讓我的同事一小時內瞭解如何開始開發iOS App,學習目標包括:

  • 能使用Xcode IDE、模擬器
  • 能修改、除錯已有iOS App
  • 能在已有應用內建立新模組
  • 能建立新應用
  • 能釋出應用到App Store

本文不包含任何高階的iOS開發知識,已學會iOS開發的同學不要看,看完這篇文章學會了的同學也不用再看了。

不僅是學習一門新語言

有過指令碼開發經驗的人(如Javascript,PHP,Shell)在剛開始學習iOS開發的時候,會覺得iOS開發的學習曲線比指令碼語言要高,是的,這種感覺是對的。因為學iOS開發,不僅是學習一門新語言,它包括:

  • 一門語言:Objective-C
  • 一個框架:Cocoa Touch
  • 一個IDE:Xcode

初學指令碼語言通常不會來繪製圖形介面、與人互動,iOS如果不做圖形介面,像指令碼語言一樣處理文字操作資料庫,就沒啥意思了。 所以,過去我寫別的新手入門教程,通常都是寫《XXX入門15分鐘教程》,而iOS就要花數倍的時間來寫了。

環境準備

做iOS開發一定要有蘋果的軟體環境:Mac OS作業系統、Objective-C編譯器、裝置模擬器等,開發工具倒不一定要用Xcode,只要是個原始碼編輯工具就行(vim都行,只是沒Xcode那麼多功能)。

Mac OS

擁有Mac OS環境最簡單的方法是找一臺蘋果電腦,包括iMac, MacBook Pro, MacBook Air, Mac Mini,但不包括蘋果的移動裝置(iPod Touch, iPhone, iPad, iPad Mini,它們執行的是iOS系統,不是Mac OS),蘋果電腦在出廠的時候就會預裝Mac OS,目前最新版本是Mac OS X 10.8,主流的版本還有Mac OS X 10.6、Max OS X 10.7。 如果囊中羞澀,可以借一臺,或者上淘寶買個二手的。

黑蘋果

提到iOS開發入門,似乎沒辦法不說黑蘋果。所謂黑蘋果,就是把Mac OS改造後安裝在非蘋果的硬體上,這是違反DMCA法案的,黑蘋果的更多資料,可以在維基上找到 蘋果電腦價格高,國內軟體開發者生存壓力大,所以黑蘋果在國內也有一些真實的存在,國外當然也有啦。 黑蘋果基本可以勝任iOS開發,但有一些問題:

  • 安裝黑蘋果是非法的
  • 個人行為蘋果公司一般不會追究,但會遭同行的鄙視
  • 黑蘋果超級難裝,挑硬體。即使完全相同的型號,相同的批次,也有可能A機器裝上了,B機器裝不上
  • 黑蘋果系統多少都存在一些使用上的問題,像驅動Bug啦、待機恢復藍屏啦、上網瀏覽有問題啦
  • 黑蘋果不能隨意升級,可能升級一次safari就導致整個系統崩潰了

上面這些雖然不會直接影響Xcode寫程式碼、模擬器測試,但寫著寫著想上網查個東西的時候,safari不能翻頁,確實挺影響心情的。所以,錢包允許的前提下,還是搞個蘋果電腦省心一些。

Xcode 和 模擬器

Xcode可以在蘋果官網免費下載:Xcode下載地址 安裝Xcode時會自動安裝iOS SDK和模擬器。 這麼強大的IDE居然是免費的,還是挺讓人開心的。

從改一個現成的應用開始吧

學一門新軟體開發技能,能夠第一時間做出一個可執行的產品非常重要,有助於給自己正面激勵,我上大學的時候,有很多次想學一門新語言,往往花了半個月,還沉浸在資料型別和語法字典裡,連第一個Hello World都沒做出來。 這一次,就讓我們從改一個現成的應用開始吧。

下載

首先,我們從蘋果開發者中心下載一個示例程式碼回來。我選了ToolBarSearch。 在本文件的末尾,還有一些其它的網址可以下載開源iOS產品或者程式碼段,但我試了一下,還是Apple Sample Code最容易成功。 下載回來的zip檔案最好儲存在”下載”或者”文稿”目錄裡,因為在Mac OS 10.8以前,有些目錄(例如/var/private/tmp)在Finder中是看不到的,要通過Finder的“前往 > 前往資料夾”功能才能進入。

開啟

有三種方式可以開啟一個iOS Project

雙擊project檔案

開啟Finder,進入剛剛下載解壓的ToolBarSearch目錄,找到ToolBarSearch.Xcodeproj檔案,雙擊之,Xcode會自動啟動,並開啟這個專案

在Xcode裡選擇Project開啟

  • 在Xcode沒啟動的情況下(如果Xcode已經啟動了,就先按Command Q退出),啟動Xcode,會彈出“Welcome to Xcode”的歡迎頁,點選左下角的“Open Other”按鈕,找到ToolBarSearch目錄,雙擊ToolBarSearch目錄,或者雙擊ToolBarSearch.Xcodeproj檔案都可以
  • 如果Xcode處於開啟狀態,可以點選其選單欄的File -> Open,或者File -> Open Recent,然後再選擇要開啟的專案

通過命令列開啟

在Mac OS 10.8以前,有些目錄(例如/var/private/tmp),在Finder和Xcode的File > Open對話方塊中,點選滑鼠是找不到的,這時候就要通過命令列終端來打開了。 開啟終端,執行:

Objective-C
12 cd/ToolBarSearch的父目錄/ToolBarSearchopen-aXcode

open -a是mac os的系統命令,除了iOS專案,別的專案也可以這樣開啟。

執行剛下載的應用

點選Xcode左上角的Run按鈕(或者同時按下Comman和R鍵),Xcode會編譯原始碼並在模擬器中執行這個應用。 編譯成功會在螢幕上淡淡地顯示“Build Succeeded”。反之,失敗就顯示“Build Failed”且不啟動模擬器。

修改

在模擬器上看到“Performed search using…”了吧,下面我們改掉它。

  • 在Xcode左上角的Run按鈕下方,有一排小按鈕,從左到右第三個是一個放大鏡圖示,滑鼠移上去會顯示“Show the Search Navigator”,點一下它,開啟搜尋介面,在它下方出現的Find輸入框中輸入“performed”
  • 搜尋結果只有一條:ToolbarSearchViewController.m,點檔名下方被高亮的“Performed”字串,右側程式碼編輯區會自動開啟這個檔案,並滾動螢幕,使包含“Performed”的這一行出現在編輯區的中間。
  • 修改雙引號裡的字串,隨便改成啥,然後按“Command S”儲存。

當然,這些操作,你也可以在終端下通過grep和vim完成。

執行修改後的應用

按Command R執行,看看,是不是看到效果啦? 是的,修改一個應用就這麼簡單。

Objective-C

Objective-C是蘋果應用軟體(包括蘋果電腦上的Mac OS App和移動裝置上的iOS App)的開發語言。它是一種面向物件的程式語言。 蘋果公司還提供了一個軟體,叫Interface Builder,簡稱IB,用於視覺化的介面製作,就像用Dreamweaver做網頁,或者像Visual Basic做桌面軟體一樣。後來IB就整合進了Xcode,成了Xcode的一部分。這篇文件不講IB,只講Objective-C,因為:

  • 基本上,每一本講iOS開發的書(紙質書、電子書),都有大量的截圖一步一步教如何用IB開發iOS應用,而講Objective-C開發應用的書卻沒有那麼多。
  • IB可以用來直觀方便地畫介面、設定控制元件屬性、建立程式碼與控制元件的聯絡,但後臺的業務邏輯和資料處理仍然要靠Objective-C,可見,不管用不用IB,Objective-C都是繞不過去的。

C的超集

Objective-C擴充套件了ANSI C,是C的超集,也就是說:

  • 任何C源程式,不經修改,即可通過Objective-C編譯器成功編譯
  • Objective-C源程式中可以直接使用任何C語言程式碼

除了面向物件有語法是SmallTalk風格的(下面會講到),其它非面向物件的語法、資料型別,與C完全相同,所以本文就不再贅述。 來看一個經典的Hello World示例吧:

Objective-C
1234567 #import <Foundation/Foundation.h>intmain(intargc,char*argv[]){@autoreleasepool{NSLog(@"HelloWorld!");}return0;}

是不是彷彿穿越回了大一學習C語言的時代,看起來和C幾乎沒有區別,是吧?是的,因為還沒用到它的面向物件特性,哈哈!

SmallTalk的訊息傳遞語法風格

Objective-C的面向物件語法源自SmallTalk,訊息傳遞(Message Passing)風格。在原始碼風格方面,這是它與C Family語言(包括C/C++、Java、PHP)差別最大的地方。 在Java、C++世界,我們呼叫一個物件的某方法,在Objective-C裡,這稱作給型別傳送一個訊息,這可不僅僅是文字遊戲,他們的技術細節也是不同的。 在Java裡,物件和方法關係非常嚴格,一個方法必須屬於一個類/物件,否則編譯是要報錯的。而在Objective-C裡,型別和訊息的關係比較鬆散,訊息處理到執行時(runtime)才會動態決定,給型別傳送一個它無法處理的訊息,也只會丟擲一個異常,而不會掛掉。

Objective-C
1 [obj undefinedMethod];

在程式碼裡呼叫沒定義的方法(這是Java世界的習慣說法啊,專業的叫法是,給obj物件傳遞它無法處理的訊息),Xcode會警告,但編譯能成功,執行的時候會出錯。它會輸出這樣一個錯誤:

Objective-C
1 Terminatingapp due to uncaught exception'NSInvalidArgumentException', reason: '-[NSObject undefinedMethod]: unrecognized selector sent to instance 0x8871710'

類似Java的OOP概念

Objective-C中一些面向物件的概念,也可以在Java中找到類似的實現(只能說是類似,不是完全相同),我的讀者基本都是Java和PHP程式設計師,我會在下文中儘量用Java的概念來類比。 GoogleCode上有人整理了Java和Objective-C的概念、資料型別對應表,參見這裡

字串

Objective-C裡有字串是由雙引號包裹,並在引號前加一個@符號,例如:

Objective-C
12 title=@"Hello";if(title==@"hello"){}

PHP程式設計師要注意,在這裡不能用單引號,即使只有一個字元也不能用。Objective-C與Java、C一樣,雙引號表示字串。

函式呼叫

前文述及,不涉及面向物件時,它和C是完全一樣的。以下是幾個函式呼叫的示例:

不帶引數

Objective-C
1 startedBlock();

帶引數

Objective-C
12 NSLog(@"decrypted string:%@",str);CGRectMake(0,0,0,0);

傳遞訊息給類/例項方法

不帶引數

Objective-C
1 [obj method];

對應的Java版本

Objective-C
1 obj.method();

帶一個引數:

Objective-C
1 [counter increase:1];

對應的Java版本

Objective-C
1 counter.increase(1);

帶多個引數

對C Family程式設計師來說,這是最難接受的,最反人類的:

Objective-C
12 -(void) setColorToRed:(float)red Green:(float)green Blue:(float)blue{...}//定義方法[myObj setColorToRed:1.0 Green:0.8 Blue:0.2];//呼叫方法

對應的Java版

Objective-C
12 public voidsetColorToRedGreenBlue(floatred,floatgreen,floatblue){...}myObj.setColorToRedGreenBlue(1.0,0.8,0.2);

訊息巢狀

Objective-C
1 UINavigationBar*bar=[[[UINavigationBaralloc] init] autorelease];

對應的Java版

Objective-C
1 UINavigationBarbar=UINavigationBar.alloc().init().autorelease();//Java沒有指標,所以星號去掉了

介面和實現

Objective-C的類分為介面定義和實現兩個部分。介面定義(Interface)放在標頭檔案中,副檔名是.h,實現(implementation)放在實現檔案中,副檔名是.m(也有.mm的副檔名,表示Objective-C和C++混編的程式碼)。 介面定義也可以寫在.m檔案中,但最好不要這麼幹 需要注意的是,與Objective-C的interface概念最接近的是C和C++裡的標頭檔案,它與implementation是成雙成對出現的,作用是宣告類的成員變數和方法。它與Java的interface概念完全不同:

  • Objective-C裡,interface有且只有一個實現,Java的interface可以有0-N個實現
  • Objective-C裡,interface可以定義成員屬性,Java裡不可以

在Objective-C裡,和Java的Interface概念相似的是Protocol,下文會講到。 請看示例: Interface

Objective-C
123456789 @interfaceMyClass{intmemberVar1;idmemberVar2;}-(return_type)instance_method1;-(return_type) instance_method2:(int)p1;-(return_type) instance_method3:(int)p1 andPar:(int)p2;@end

Implementation

Objective-C
1234567891011121314 @implementationMyClass{intmemberVar3;}-(return_type)instance_method1{....}-(return_type) instance_method2:(int)p1{....}-(return_type) instance_method3:(int)p1 andPar:(int)p2{....}@end

介面和實現以@interface、@implementation開頭,都以@end結束。“@”符號在Objective-C中是個很神奇的符號。 冒號也是方法名的一部分,method和method:是兩個不同的方法名,不是overload,第二個帶引數。 上述程式碼對應的Java版:

Objective-C
1234567891011121314151617 public classMyClass{protected intmemberVar1;protected pointer memberVar2;private intmemberVar3;public(return_type)instance_method1(){....}public(return_type)instance_method2(intp1){....}public(return_type)instance_method3andPar(intp1,intp2){....}}

私有方法和公開方法

寫在.h標頭檔案裡的方法都是公開的,Objective-C裡沒有私有方法的概念(沒有你說個蛋啊,哈哈哈哈)。 官方並沒有提到Objective-C怎麼實現私有方法,我查閱了stackoverflow,統一的答案是,要實現私有方法的效果只能藉助Category,不過,根據我的測試,即使採用了Category,也不能阻止外部的程式碼呼叫這個“私有方法”,只是Xcode不支援“私有方法”的自動完成,並會有警告提示,執行的時候,還是會成功的。各位看官知道有這麼回事就可以了,這裡不深講。

變數和屬性

類方法和例項方法

類方法

類方法就是Java、PHP裡的Static Method,不用例項化就能調。類方法有一個加號字首。 示例: 類定義