iOS开发公开课总结
?????????????????????????????????????????????????????????????????? iOS開發公開課總結
前言
iphone開發相關的教程中最有名的,當數斯坦福大學發布的”iphone開發公開課”了。此公開課在以前叫做《iphone開發教程》,今年由于平板電腦的流行,所以也加入了ipad開發相關的課程。在網易公開課上,有該教程的2010年錄象,并且前面15集帶中文字幕文件,非常適合初學者學習。
在這里順便說一下,網易公開課上的28集其實并不需要全部看完。真正的課程只有前面12集。后面的課程都是請一些業界的名人講他們成功的app以及學生的作品展示,可看可不看。所以大家不要被28集這么多嚇到。
由于近一年來iOS5以及xcode4的發布,蘋果對原有的開發環境xcode以及開發語言Objective-C都有改進,所以原有的教程中很多內容不再適用了。例如新的xcode4將Interface Builder集成到xcode中,整個IDE布局和快捷鍵完全大變樣,又比如蘋果為Objective-c引用了ARC和Storyboard,這些都使得app的編程方式大為不同。
值得高興的是,斯坦福大學最近更新了該公開課的2011年秋季錄象,免費下載地址是:http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=480479762,不過現在該公開課還沒有翻譯,只能看英文原版了。新的課程相比以前要短了許多,一共只有9課。我大概快速看了一遍,總結一些心得給大家。
iOS的MVC模式
MVC模式算是客戶端類程序使用的設計模式的標配了。iOS對于Model, View和Controller之間的相互調用有它自己的規范和約定,在公開課的第一課中,就介紹了應該如何將MVC模式應用在iOS開發中。主要的內容就體現在如下這張圖中(圖片來自該公開課第一課的配套pdf的第37頁):
我下面詳細介紹一下這幅圖的意思。
-
首先圖中綠色的箭頭表示直接引用。直接引用直觀來說,就是說需要包含引用類的申明頭文件和類的實例變量。可以看到,只有Controller中,有對Model和View的直接引用。其中對View的直接引用體現為IBOutlet。
-
然后我們看View是怎么向Controller通訊的。對于這個,iOS中有3種常見的模式:
- 設置View對應的Action Target。如設置UIButton的Touch up inside的Action Target。
- 設置View的delegate,如UIAlertViewDelegate, UIActionSheetDelegate等。
- 設置View的data source, 如UITableViewDataSource。通過這3種模式,View達到了既能向Controller通訊,又不需要知道具體的Controller是誰是目的,這樣就和Controller解耦了。
-
最后我們看Model。Model在圖上有一個信號塔類似的圖形,旁邊寫著Notification & KVO。這表明Model主要是通過Notification和KVO來和Controller通訊的。關于Notification,我寫了一個模版代碼片段如下:(關于代碼片段的管理,推薦大家看我寫的另一篇文章:使用Github來管理xcode4中的代碼片段
| 1 2 3 4 5 6 7 | // 監聽通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(<#methodName#>) name:kLoginNotification object:nil]; // 取消監聽 [[NSNotificationCenter defaultCenter] removeObserver:self]; // 發送通知 NSDictionary * userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:200] forKey:@"code"]; [[NSNotificationCenter defaultCenter] postNotificationName:<#notification_name#> object:self userInfo:userInfo]; |
所以,對于初學者,要正確地使用MVC模式還是挺難的,回想我們以前做公司某產品iphone版的時候,就有一些Model層直接依賴了Controller層,比如Model層更新數據失敗了,直接調用Controller層顯示出一個失敗的提示界面。這樣層次劃分不清,造成我們做ipad版的時候很痛苦。最后我們做了代碼重構,把Model的相應改變都用Notification來完成,使得在做ipad版開發時輕松了很多。
Convention About synthesize
“Convention over configuration”(約定高于配置)成就了Ruby On Rails,而iOS也有很多編程的約定。這些約定單獨看沒有什么好處,約定的最大好處就是,如果大家都遵守它,那么代碼風格會趨于一致,你會很方便地讀懂或修改別人的代碼。
我們可以從第一課PPT的第50頁看到如下的代碼:
從圖中可以看到,該課程推薦大家在使用synthesize關鍵字時,為property設置一個下劃線前綴。我也看過一些iphone的開源項目,比如facebook開源的 three20 ,它是遵守了這樣的約定的。
其它的約定還包括:
- 以new, copy, alloc開頭的方法,都應當由調用者來release,而其它方法,都返回一個autorelease對象。
- 通常iphone頂部的bar應該用UINavigation控件,而底部的bar應該用UIToolbar控件。
- 所有的UI操作都應該在主線程(UI線程)進行。這個似乎不是約定,但是好多同學不知道,也寫在這兒吧。
UIView
剛開始對界面之間的跳轉很不理解,后來發現其實很簡單,就是一層一層疊起來的View。從View A上點擊一個按鈕跳轉到View B,其實就是把View B“蓋”在View A上面而已。而“蓋”的方式有好多種,通常的方法有2種:
一. 用UINavigationController把View B push進來。
| 1 | [self.navigationController pushViewController:nextView animated:YES]; |
二. 用presentModalViewController方法把View B蓋在上面。
| 1 | [self presentModalViewController:nextView animated:YES]; |
除此之外,其實還有一種山寨方法,即把View A和View B都用addSubView加到AppDelegate類的self.window上。然后就可以調用 bringSubviewToFront 把 View B顯示出來了,如下所示:
| 1 2 3 4 5 | // AppDelegate.m類 [self.window addSubview:viewB]; [self.window addSubview:viewA]; // 在需要時調用 [self.window bringSubviewToFront:viewB]; |
上面說的是界面之間的跳轉。對于一個界面內,其控件的布局其實也是一個一個疊起來的,之所以說疊,是指如果2個控件如果有重疊部分,那么處于上面的那個控件會蓋住下面的。
Nib File
Nib文件實際上內部格式是XML,而它本身并不編譯成任何二進制代碼。所以你如果用iFile之類的軟件在iPhone上查看一些安裝好的軟件的目錄,可以看到很多的以nib結尾的文件,這些就是該軟件的界面文件。雖然這些XML經過了一些壓縮轉換,但是我們還是可以看到一些信息,例如它使用了哪些系統控件等。
Nib文件剛開始給我的感覺很神秘,后來發現它其實就是用于可視化的編輯View類用的。其中的 File’s Owner一欄,用于表示這個View對應的Controller類。通常情況下,Controller類會有一個名為view的變量,指向這個view的實例,我們也可以建立多個IBOutlet變量,指向這個view上的控件,以便做一些界面上的控制。
在Interface Builder上還有一個好處,是可以方便的將View的事件與Controller的IBAction綁定。只需要按住Ctrl鍵,從控件往File’s Owner一欄拖拽,即可看到可以綁定的方法列表。其實這些只是簡化了我們的工作,如果完全拋開Interface Builder,我們一樣可以完成這些工作。我所知道業界的一些iOS開發部門,為了多人協作更加方便,更是強制不允許使用Interface Builder,一切界面工作都在代碼中完成。如果你用文本編輯器打開Nib文件看過,就能理解這樣做是有道理的。因為如果2個同時編輯一個界面文件,那么沖突的可能性是100%,而且,從svn結出的沖突信息上看,你根本無法修正它。下面的代碼演示了如何不用Interface Builder來添加控件以及綁定UI事件。
| 1 2 3 4 5 6 7 8 9 10 11 | // SampleViewController.m的viewDidLoad方法片段 // 添加Table View控件 UITableView * tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)]; [self.view addSubview:tableView]; tableView.delegate = self; [tableView release]; // 添加Button控件 self.button = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 100)] autorelease]; [self.view addSubview:self.button]; // 綁定事件 [self.button addTarget:self action:@selector(buttonPressed) forControlEvents:(UIControlEventTouchUpInside)]; |
總結
以上是生活随笔為你收集整理的iOS开发公开课总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卖家新神器:淘宝宝贝复制专家。可以复制淘
- 下一篇: 蓝桥杯单片机555定时器频率测量 非常简