1 iOS系統(tǒng)層次
iOS系統(tǒng)層次自頂向下分為Cocoa Touch
既绩,Media
概龄,Core Services
,Core OS
饲握。每層內(nèi)容如下私杜,其中Core OS
這一層在iOS開發(fā)中涉及較少,一般開發(fā)中打交道最多的估計是Cocoa Touch
和Core Service
這兩層救欧。
2 MVC
MVC即Model衰粹,View,Controller笆怠,其在iOS開發(fā)中是一個很重要的模式铝耻,我們的代碼編寫要符合MVC規(guī)范。我們可以看下MIT的iOS教程中關(guān)于MVC的經(jīng)典的注解蹬刷,簡而言之:Model是你應(yīng)用的數(shù)據(jù)模型瓢捉,View是視圖展示,而Controller則是控制數(shù)據(jù)在視圖上展示的邏輯办成。
Model = What your application is (but not how it is displayed)
Controller = How your Model is presented to the user (UI logic)
View = Your Controller’s minions
上面是MVC的交互圖泡态,多個MVC就可以組成一個復雜的應(yīng)用了。通過這個圖迂卢,我們可以歸納下面幾點:
- a)
Controller
是個中間人角色某弦,即可以直接跟View
通信,也可以直接跟Model
通信而克。 - b)
Controller
與View
通過outlet
連接(比如我們常常CTRL+Drag
來拖拽一個控件到UIViewController
中靶壮,建立outlet連接,然后我們就可以在UIViewController
中操作UIView
了)员萍,而View
與Controller
則通過綁定的action
和target
來實現(xiàn)(如一個按鈕可以綁定點擊事件到一個target
的action
(action
通常為@selector(func)
這種格式)亮钦,action
為事件發(fā)生后的處理方法,而target
則通常為對應(yīng)的Controller
)充活。 -
c)
View
和Model
不允許直接通信(注意圖中的雙黃線)蜂莉。 - d)
View
通過設(shè)置data source
和delegate
為Controller
來委托Controller
從Model
中獲取數(shù)據(jù)(如UITableView中就會用到代理)蜡娶。Model
要跟Controller
通信則可以通過Notification和KVO
機制來實現(xiàn)(觀察者模式)。
3 View Controller生命周期
View Controller
控制View
的展示邏輯映穗,它的生命周期是這樣的:
- 1)從
storyboard
中初始化(或者從nib文件加載)窖张。 - 2)
awakeFromNib
方法調(diào)用。注意這個時候outlet
是還沒有設(shè)置好的蚁滋。(我在例子代碼的awakeFromNib
方法里面打印label的值宿接,確實為null) -
viewDidLoad
方法調(diào)用。(注意辕录,這個時候雖然outlet
設(shè)置好了睦霎,不過View
的位置坐標還沒有設(shè)置好,所以那些跟位置相關(guān)的初始化代碼不能放在這個方法里面)
-
-
viewWillAppear
方法調(diào)用走诞。這個方法可能調(diào)用多次副女,所以對于一些只初始化一次的代碼不要放在這里。對于應(yīng)用中占用內(nèi)存大的部分蚣旱,在viewWillDisappear
的時候最好釋放內(nèi)存碑幅,在本方法里面再重新加載數(shù)據(jù)。(如果View
的frame
有一些變化塞绿,則接著會調(diào)用下面兩個方法沟涨,注意,任何時候View
可見且位置坐標發(fā)生了變化异吻,都會調(diào)用下面的兩個方法來調(diào)整subview
的位置以適應(yīng)View
的坐標變化裹赴,比如旋轉(zhuǎn)屏幕且設(shè)定了View
可以旋轉(zhuǎn),就會調(diào)用這兩個方法)viewWillLayoutSubviews
viewDidLayoutSubviews
-
-
viewDidAppear
方法調(diào)用诀浪。同前面棋返,這個方法也可能調(diào)用多次。
-
- 如果視圖發(fā)生切換笋妥,從一個
View
進入到另一個View
或者雙擊HOME
鍵殺掉這個視圖,則會調(diào)用前一個View
的viewWillDisappear
和viewDidDisappear
方法窄潭。而從另一個View
返回前一個View
春宣,則會再次調(diào)用前一個View
的viewWillAppear
和viewDidAppear
方法。
- 如果視圖發(fā)生切換笋妥,從一個
下面是View Controller
的狀態(tài)轉(zhuǎn)換圖嫉你,可以更清晰的看到這個流程:
簡單的測試代碼: https://github.com/shishujuan/ios_study/tree/master/lifecycle/ViewControllerLifeCycle
4 參考資料
- MIT 的 iOS 7開發(fā)教程
- GettingStartedDevelopiOSAppsSwift