ViewController是iOS開發(fā)中MVC模式中的C(視圖控制器),ViewController是view的controller皂甘,ViewController的職責(zé)主要包括管理內(nèi)部各個(gè)view的加載顯示和卸載源哩,同時(shí)負(fù)責(zé)與其他ViewController的通信和協(xié)調(diào)徒扶。
- 在IOS中绎晃,有兩類ViewController
- 一類主要用于展示內(nèi)容赁豆,比如UIViewController波附、UITableViewController等艺晴,同時(shí)還可以自定義繼承自UIViewController的ViewController昼钻;
- 另一類是ViewController容器,UINavigationViewController和UITabBarController等封寞,UINavigationController是以Stack的形式來(lái)存儲(chǔ)和管理ViewController然评,UITabBarController是以Array的形式來(lái)管理ViewController。
不管是哪類ViewController,都繼承自UIViewController
UIViewController --> 生命周期方法
控制器從創(chuàng)建到銷毀方法的執(zhí)行順序
load->initialize->init(initWithNibName)—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc
其中viewWillUnload跟viewDidUnLoad 在iOS6以后就過(guò)期了.
收到low-memory時(shí)系統(tǒng)不會(huì)釋放view狈究,而只是釋放controller的resource碗淌。
- LoadView: 控制器調(diào)用loadView方法創(chuàng)建控制器的view.當(dāng)控制器的view存在了就不會(huì)調(diào)用.
- 不要再LoadView中調(diào)用[super loadView],會(huì)影響CPU性能
- 蘋果官方文檔
- You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property.
- 當(dāng)系統(tǒng)要展示這個(gè)控制器view的時(shí)候,會(huì)先去view的getter方法中尋找有沒有返回view,如果view == nil,系統(tǒng)就會(huì)主動(dòng)去調(diào)用這個(gè)方法.
控制器的view都是懶加載,當(dāng)需要展示的時(shí)候才會(huì)去創(chuàng)建
- 懶加載:重寫getter方法
- 好處:不用管什么時(shí)候需要?jiǎng)?chuàng)建,做到要用時(shí)再創(chuàng)建
view的加載過(guò)程
從代碼中加載view
從storyboard/xib中加載view
- ** 實(shí)現(xiàn)過(guò)程 **
- 先去判斷當(dāng)前控制器是不是從StoryBoard當(dāng)中加載的,如果是,那么它就會(huì)從StoryBoard當(dāng)中加載控制器的View.
- 如果不是從StoryBoard當(dāng)中加載的, 那么它還會(huì)判斷是不是從Xib當(dāng)中創(chuàng)建的控制器.
如果是,那么它就會(huì)從xib加載控制器的View. - 如果也不是從Xib加載的控制器.那么它就會(huì)創(chuàng)建一個(gè)空的UIView.設(shè)為當(dāng)前控制器的View.
注意點(diǎn):- 一旦重寫了loadView,表示需要自己創(chuàng)建控制器的View.
- 3.2 如果控制器的View還沒有賦值,就不能調(diào)用控制器View的get方法.會(huì)造成死循環(huán).
因?yàn)榭刂破鱒iew的get方法底層會(huì)調(diào)用loadView方法.
-
viewDidLoad: 當(dāng)控制器View加載完畢時(shí)調(diào)用
- 我們經(jīng)常會(huì)在這個(gè)方法里面做一些控件的初始化操作,其中可能會(huì)給一些控件設(shè)置尺寸位置,但是需要注意的是在這個(gè)方法內(nèi)只能參照控制器的view的尺寸,不能參照其他子控件的尺寸
viewWillAppear: 視圖將要顯示的時(shí)候調(diào)用
viewWillLayoutSubviews: viewWillLayoutSubviews即將對(duì)子控件進(jìn)行布局
viewDidLayoutSubviews:當(dāng)控制器View布局子控件完畢時(shí)調(diào)用
可以在此方法中可以用子控件的尺寸做參考
在這個(gè)方法內(nèi)真正做一些控件布局的操作,可以拿到控件尺寸.
不管是從xib,strongBoard,代碼中加載的控件,willAppear之后都會(huì)調(diào)用這個(gè)方法,方法調(diào)用很頻繁
viewDidAppear:當(dāng)控制器View顯示完畢時(shí)調(diào)用
viewWillDisappear:當(dāng)控制器View既將消失時(shí)調(diào)用
** viewDidDisappear:**當(dāng)控制器View消失完畢時(shí)調(diào)用
-
dealloc: 視圖被銷毀,此處需要對(duì)你在init和viewDidLoad中創(chuàng)建的對(duì)象進(jìn)行釋放
- 在這個(gè)方法內(nèi),我們通常會(huì)把添加在控制器內(nèi)的一些東西給移出.例如:KVO監(jiān)聽者,HUD,定時(shí)器等
didReceiveMemoryWarning: 當(dāng)收到系統(tǒng)發(fā)出的內(nèi)存警告時(shí)調(diào)用,我們可以截獲系統(tǒng)發(fā)出的內(nèi)存警告然后做一些是自定義事情
收到內(nèi)存警告系統(tǒng)執(zhí)行步驟
類
load:當(dāng)一個(gè)類被加載時(shí)調(diào)用,只加載一次
initialize:當(dāng)本類或者子類被加載時(shí)調(diào)用,可能調(diào)用多次
init:用代碼創(chuàng)建類的時(shí)候調(diào)用,只能做一些初始化操作,不能設(shè)置控件的frame,init其實(shí)是去調(diào)用initWithFrame,只不過(guò)frame為CGRectZero
initWithFrame:用代碼創(chuàng)建類的時(shí)候調(diào)用,只能做一些初始化操作,不能在這設(shè)置控件的frame,如果已經(jīng)知道了frame,那么在這里設(shè)置子控件的frame是沒有問(wèn)題的,但是如果外界使用init的方式創(chuàng)建,最終也會(huì)調(diào)用initWithFrame方法,此時(shí)的frame傳進(jìn)來(lái)是0,那么,在這個(gè)方法里面設(shè)置的子控件的frame也會(huì)為0.所以,為了嚴(yán)謹(jǐn)起見,最好不要在這個(gè)方法里面設(shè)置子控件的frame.
initWithCoder:從xib/storyboard中加載就會(huì)調(diào)用此方法,只能在這個(gè)方法做一些一次性設(shè)置,不能設(shè)置控件的frame
awakeFromNib:從文件中加載.就會(huì)調(diào)用此方法,可以在這個(gè)方法中設(shè)置frame
-
layoutSubviews:布局本類或者子控件時(shí)調(diào)用,調(diào)用頻率頻繁,通常在這里設(shè)置子控件的位置
- 注意:一定要在[super layoutSubviews];之后進(jìn)行設(shè)置控件的frame
- 蘋果官方文檔
- You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want.
- 當(dāng)我們?cè)谀硞€(gè)類的內(nèi)部調(diào)整子視圖位置時(shí)抖锥,需要調(diào)用亿眠。反過(guò)來(lái)的意思就是說(shuō):如果你想要在外部設(shè)置subviews的位置,就不要重寫
- 如果沒有先調(diào)用[super layoutSubviews];可能設(shè)置了frame,控件也不會(huì)顯示
- 可能觸發(fā)layoutSubviews的情況
- addSubviews
- 滾動(dòng)scrollView
- 旋轉(zhuǎn)Screen會(huì)觸發(fā)父類的layouSubviews
- ....
困了????????
有建議的小伙伴歡迎留下你寶貴的意見.??
讓我們一起學(xué)習(xí)一起進(jìn)步.??