iOS开发入门教程
程序發輕狂,代碼闌珊,蘋果開發安卓狂!——寫給狂熱的編程愛好者們
寫在前面的話
學習iOS應用程序開發已有一段時間,最近稍微閑下來了,正好也想記錄一下前階段的整個學習過程。索性就從最基礎的開始,一步一步記錄一個最簡單的iOS應用從創建到運行的全過程,其中會穿插很多相關知識或是遇到過的問題。其實算不上教程,但希望能夠幫助更多的開發愛好者更快、更好的入門。
iOS開發環境簡述
最友好,最現實,也是最方便的開發環境就是在Mac系統中安裝Xcode進行開發。原因在于:第一,開發工具(Xcode)限制。蘋果官方只提供Mac版的Xcode,而Xcode內置了Xcode IDE,性能分析工具,iOS SDK,iOS模擬器和最新的OS X,可以方便迅速的進行代碼編輯以及應用調試,可謂是Mac和iOS開發工具的不二選擇。第二,代碼提示和自動補全。iOS開發中用到的類或方法的名稱,為了更具語義化,讓開發者一目了然,通常會比較長,這往往會讓剛剛接觸iOS開發的開發者為了記住這些方法而傷透腦經。而Xcode擁有優于其他編輯器的OC代碼提示和自動補全功能,這將很大程度降低開發入門的門檻,這決定你開發iOS應用沒有理由不使用Xcode。因此,使用非蘋果電腦的開發者們最好安裝Mac OS X的虛擬機,進行開發學習,否則你不僅會比別人花上多出一倍甚至更多的時間去搭建開發環境,而且代碼編寫上也會比使用Xcode開發的人花上更多的精力。
第一步,創建項目
1.1 新建iOS項目
打開Xcode,如果是首次打開Xcode,你將會看到一個歡迎界面,如圖:
你可以直接在該界面中點擊圖中1處標記的Create a new Xcode project來創建一個項目,也可以點擊圖中2處標記的按鈕來打開電腦中已經存在的Xcode項目。你還可以修改3處標記的復選框狀態設置下次啟動Xcode是否顯示該歡迎界面。
本文不演示在此點擊1處所示創建項目,首先點擊該界面左上角的紅色按鈕退出該歡迎界面,然后點擊屏幕左上角的File->New->Project。截圖如下:
接下來你將看到如下界面:
首先進行系統篩選,iOS應用則選擇iOS列表對應項,OS X應用則選擇OS X列表對應項。本例為iOS應用,故在此選擇iOS中的Application(圖中左上角紅框所示),然后選擇應用模板選擇,在界面右邊列出了多種最常用的應用模板類型,開發者按照自己的應用需求可自行選擇,本例選擇Single View Application(圖中右上角紅框所示)。做完以上選擇后點擊窗口右下角Next按鈕,進入下一個設置窗口:
此處內容會根據個人情況而不同,故不做贅述,按照窗口提示,填寫相關信息即可。注意窗口下方的三個復選框,其功能分別是使用storyboards、使用自動引用計數器、包含單元測試,根據個人情況勾選/取消即可。設置完成后點擊右下角Next按鈕,進入下一個窗口:
按照窗口所示,選擇項目存儲位置后點擊窗口右下角Create按鈕,完成應用創建過程。
1.2 應用程序目錄結構說明
項目創建完成之后,Xcode會進入項目開發界面,界面大致分為三部分,左側項目及目錄結構列表、中間為代碼編輯區、右側屬性設置和控件列表等區域。下面是目錄結構的截圖:
項目初始時包含如圖所示三個主要目錄,后續開發中開發者可以自行添加目錄。其中:
- FirstIosApp目錄與項目名稱同名,主要存放應用相關源代碼和配置文件;
- Framework存放項目使用到的框架,默認會添加圖示三個必備框架;
- Products用于存放生成的應用文件,開發中開發者一般不必關心。
1.3 應用程序初始結構概覽
整個應用程序的入口文件默認為AppDelegate.m,應該可以通過配置文件修改(未嘗試)。其內部結構如下:
該文件包含應用程序生命周期中各個階段可以調用的方法接口,以便應用程序在不同的狀態階段能進行相應的操作。這些方法就不一一說明了,開發者幾乎可以望名知意。
1.3.1 iOS應用程序的生命周期
對于上面圖示方法如果還有不解的地方,可以參考下圖(來源于網絡):
第二步 代碼入門(數據類型)
做iOS開發,僅僅懂得使用Xcode,僅僅了解目錄結構,僅僅了解生命周期,是遠遠不夠的,這些只是基礎中的基礎。一定的編程能力也是必不可少的。下面就簡單的介紹一下iOS開發的編程語言——Objective-C,后面簡稱OC。
學習一門語言,往往需要從最基礎的數據類型開始(記得大學學習的時候老師就是這么干的),至于編程邏輯,奇技淫巧等則是在開發過程中慢慢積累的。好言歸正傳。
2.1 基礎數據類型
OC是C語言的一個超類,因此OC擁有C或C++的幾乎所有特性,當然它也有自己獨具一格的地方。所以OC也支持C語言的數據類型,諸如int,float等也都可以在OC中使用。基礎數據類型不是本文重點,在此就不多言辭了。
2.2 OC數據類型
OC不是僅僅只能使用C/C++的數據類型,它也擁有自己的數據類型,雖然與通常人們熟知的各種數據類型看起來有點怪異,但事實上OC的數據類型是個很好玩的東西,也不難理解。下面列舉幾個常見的OC數據類型。
2.1.1 NSNumber類和NSInterger
NSNumber是以對象的形式來包裝基礎數據類型,它提供以下方法:
<!-- lang: cpp --> + (NSNumber *) numberWithChar: (char) value; + (NSNumber *) numberWithInt: (int) value; + (NSNumber *) numberWithFloat: (float) value; + (NSNumber *) numberWithBool: (BOOL) value;例如,要從一個int數據初始化一個NSNumber可以這樣寫:
<!-- lang: cpp --> NSNumber *number = [NSNumber numberWithInt: 100];而要從NSNumber實例得到NSInteger數據則可以如下操作:
<!-- lang: cpp --> NSInteger integer = [number intValue];2.1.2 NSString類型
NSString是OC的字符串類。與普通字符串不同的是NSString的值需要在普通字符串前加上一個@符號。例如要初始化一個'I'm a string.'的OC字符串,我們需要這樣做:
<!-- lang: cpp --> NSString *str = [NSString stringWithString: @"I'm a string."];看起來很麻煩,很復雜的樣子,不要擔心,OC應該也考慮到了這一點,所以它也提供簡寫形式:
<!-- lang: cpp --> NSString *str = @"I'm a string.";NSString類還提供了很多其他形式的創建字符串的方法(比如:stringWithFormat等),這里就不一一列舉了,以后在開發中慢慢體會吧。
2.1.3 NSArray類型
NSArray是OC的數組類。OC的數組是很強大的,在一個數組中可以允許存在不同類型的數據,這個特性就跟強大的JavaScrit一樣。初始化一個數組可以這樣操作:
<!-- lang: cpp --> NSArray *arr = [NSArray arrayWithObjects:@"a", @"b", @1, nil];當然也支持簡化形式:
<!-- lang: cpp --> NSArray *arr = @[@"a", @"b", @1];需要說明一點,使用arrayWithObjects方法創建數組的時候最后需要以nil結尾,而使用簡化方式的時候不需要。
開發中可以使用以下兩種形式獲取數組對應索引位置(index)的值:
<!-- lang: cpp --> NSString *a = arr[index]; NSString *b = [arr objectAtIndex: index];2.1.4 NSDictionary類型
NSDictionary是OC的字典類。字典類型在使用中以key-value鍵值對的形式存在。也支持多種初始化方式,下面列舉兩種:
<!-- lang: cpp --> NSDictionary *dic = [NSDictionary dictionaryWithObjects:@[@"a",@"b", @"c"] forKeys:@[@"first", @"second", @"third"]]; //或者使用下面的形式 NSDictionary *dic = @{@"first": @"a", @"second": @"b", @"third": @"c"};取值方法跟NSArray大同小異:
<!-- lang: cpp --> NSString *a = [dic objectForKey: @"first"]; NSString *b = dic[@"second"];2.1.5 NSDate類型
NSDate是OC的日期類。常見用法舉例:
<!-- lang: cpp --> NSDate *date = [NSDate date]; //返回當前時間 NSDate *date = [[NSDate alloc] init]; //初始化為當前時間,類似date第三步 OC類的認識(成員變量和方法)
iOS開發常常伴隨著視圖,而視圖往往離不開視圖控制器,在iOS開發中每一個視圖控制器就是一個OC的類,因此學習iOS開發就必須了解OC的類。
OC的類使用@interface ClassName: superClass <protocol> … @end結構來定義,NSObject是所有OC類的父類。與java相比OC的@interface關鍵字就等同于JAVA的class關鍵字,OC的protocol就是JAVA中的interface,這一點很據迷惑力,大家在學習時需要特別注意。
3.1 類的聲明
舉例聲明一個Person的類(視圖控制器)并實現它,擁有name、age兩個成員變量,自然需要定義getName和setName、getAge和setAge,下面我們看下這個過程。
首先,類的結構如下:
<!-- lang: cpp --> @interface Person: NSObject {NSString *name;int age; }@end然后,我們聲明它的setter和getter方法,用來設置和讀取它的成員變量的值。按照傳統方式應該如下定義:
<!-- lang: cpp --> @interface Person: NSObject {NSString *name;int age; }- (void) setName: (NSString *) newName; - (NSString *) getName;- (void) setAge: (int) newAge; - (int) getAge;@end看,是不是很簡單?然而,既然上面說了是傳統方式,那么肯定OC還提供了更現代的方式:
<!-- lang: cpp --> @interface Person: NSObject {NSString *name;int age; }@property(nonatomic, strong) NSString *name; @property(nonatomic, assign) int age;@end沒錯,你沒看錯,就這么簡單,它的功能和上面的代碼是一樣的。補充一下,@property本身可以接受參數來指定變量的getter和setter方式,其參數可用值和具體功能如下:
<!-- lang: cpp --> nonatomic //聲明變量只在單線程中工作 atomic //默認值,可能有多個線程會用到這個變量copy //分配一個新的空間,把原地址的內容復制過來 assign //簡單的傳遞指針 retain //傳遞指針后引用計數器(retainCount)會自加1strong //強引用 weak //弱引用聲明就這樣就完成了,下面我們看下它的具體實現,在OC中類的實現需要使用另外一個關鍵字@implementation,格式如下:
<!-- lang: cpp --> @implementation Person@end我們還是先看下傳統方式聲明getter和setter方法該如何實現:
<!-- lang: cpp --> @implementation Person- (void) setName: (NSString *) newName {self.name = newName; }- (NSString *) getName {return self.name; }- (void) setAge: (int) newAge {self.age = newAge; }- (int) getAge {return self.age; }@end看完傳統實現方式,是不是很想一睹現代方式的風采?我們繼續往下看:
<!-- lang: cpp --> @implementation Person@synthesize name; @synthesize age; //或者直接下面一句 //@synthesize name,age;@end是不是很神奇?在新版的Xcode中,@synthesize是可以省略的,但是建議還是都寫上。
3.2 “+”和“-”
仔細的讀者應該已經發現在上面的傳統方式中包含了一個神奇的符號“-”。這個是什么意思呢?首先我們需要說明一下,一個類可以擁有成員變量和方法,而方法可以包含類方法和實例方法。所謂類方法是可以使用類名直接調用的方法,而實例方法是需要該類的實例才可以調用的方法。而在OC中使用“+”表示該方法為類方法,而“-”很簡單自然是表示實例方法了。
至于方法的聲明和實現大致和傳統方式聲明getter和setter是一樣的,這部分就不再重復了。
第四步 運行和調試
每一個應用的開發過程都是漫長的,而在這個過程中我們免不了需要不時的運行一下程序,看看當前的效果,檢查一下代碼是否存在異常或者錯誤。
4.1 iOS模擬器
4.1.1 選擇設備
Xcode的強大不是吹出來的,在Xcode中內置了iOS模擬器,能夠模擬幾乎所有iOS真機的功能,因此開發者可以通過iOS模擬器測試正在開發中的應用程序,提高開發效率,減少錯誤,節省開發時間。在運行前選擇與應用對應的模擬設備是必須的,否則可能導致運行結果出現意外的問題。
在Xcode的菜單欄下方提供了選擇模擬器的地方,如圖所示:
選擇好模擬器后點擊左側的Run按鈕,就可以在指定的模擬器中啟動應用了。第一次啟動模擬器一般會比較慢,后面就好了。同樣可以點擊Run旁邊的Stop按鈕,停止模擬器中的當前應用。也許有些時候你想獨立運行iOS模擬器,而不啟動當前應用,這也是可以的,請看下圖:
也許相同的設備,但是卻又多個尺寸,多個屏幕分辨率,例如:iPhone就有4、4S、5等。那怎么選擇呢?別當心,有模擬器呢:
真是iOS模擬器在手,開發調試不用愁啊!
4.1.2 模擬器自定義設置
看完了上面的介紹,是不是感覺有一種馬上動手的沖動?先別急,還有更高級的呢!大家知道,現在很多流行的iOS應用都有定位功能,那么在模擬器怎么測試定位呢?看看下圖你就明白了:
4.1.3 存儲屏幕快照
開發應用程序通常都不是一步到位的,過程中可能會產生各種各樣稀奇古怪的現象,也許是顯示不正常,也許是出現意外的效果,也或者你想把你當前的顯示效果分享給開發團隊的其他成員,這個時候作為開發者,你也許想要記錄出現的這些現象,比如:截圖、錄屏什么的。這些都是不錯的方法,但是iOS模擬器擁有更加方便的方式,如圖所示:
4.2 程序調試
每一個開發者都不能保證他的程序是完美的,所以通常在我們運行程序的時候會出現很多奇怪的警告或者錯誤,有的可以一目了然,迎刃而解,有的卻隱藏得很深,很難發現。這時候斷點調試就直觀重要了。
在代碼編輯器的左邊的行號區,鼠標在這個區域單擊可以在對應行上添加/關閉(不是刪除)斷點。啟動斷點,當再次運行程序的時候,程序若執行到當前行,則會暫停在當前行上,開發者可以在控制臺看到斷點處記錄的信息。大致如圖:
如圖所示,在斷點處我們可以在控制臺看到變量date的當前值以及內存地址等信息,這樣就可以通過這些信息判斷程序運行到該處時是否正常,也可以這樣查看一些其他信息。
4.3 NSLog
有些時候我們可能會遇到一些僅靠斷點無法解決的問題,這時我們還可以借助NSLog進行調試。NSLog也用于在控制臺輸出信息。如圖:
總結
- 上一篇: 大一新生HTML期末作业,网页制作作业(
- 下一篇: 网络神采 网站数据采集软件