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