控制器的生命週期

控制器的生命週期就是一些列的方法控制不少關於視圖控制器如何隨時間變化的操做;當事件發生時,會被髮送至UIViewController,你的控制器是UIViewController的子類,若是你想知道事件什麼時候發生,就要重寫這些方法,不要忘記調用方法的超類;你須要知道以下消息,這樣你的視圖控制器的視圖才能在iOS環境中正常運行:網絡

  1. 你須要對控制進行初始化
  2. 你須要知道本身什麼時候在屏幕出現和消失
  3. 你須要知道邊界什麼時候改變,你的幾何變化

生命週期開始於建立,大部分視圖控制器都是從storyboard中建立的,storyboard不會生成代碼,你基本上是直接編輯對象(UIButton、UITextView),當保存storyboard時,他們像是冷凍乾燥了,而後當程序運行時,水又回來,它們又活過來了。app

viewDidLoad

- (void)viewDidLoad:(BOOL)animated;  初始化代碼,輸出口
  1. 適用範圍
    • 進入controller第一個調用的方法且一個週期只會被調用一次,主要放置控制器初始化代碼(由於init不會在視圖控制器中調用,因此能夠把init所有內容放在這裏)
  2. 限制條件
    • 不要在viewDidLoad裏添加任何視圖形狀的初始化信息 當viewDidLoad被調用的時候,視圖邊界尚未被肯定,由於你還不知道程序竟會被運行在什麼設備中或者是否被旋轉。當它出如今屏幕上,也許不會出如今預約位置。

viewWillAppear

- (void)viewWillAppear:(BOOL)animated; 視圖將要出現
  1. 適用範圍
    • 每次視圖從新在屏幕上顯示時,它都會被調用,調用的頻率比較高。若是你須要執行的某些初始化基於某些數據,而這些數據可能在視圖控制器視圖離開屏幕時會發生變化(好比模型,最好同步model)在viewWillAppear對不可見時可能改變的內容進行同步
  2. 注意
    • 不要添加一次性初始化的內容,這是viewDidLoad的責任。由於當應用有多個MVC時,它們會交替出現消失,全部viewWillAppear會被屢次調用。
    • 添加代碼實現優化 若是你添加的操做須要大量資源,好比你要在viewDidLoad進行網絡操做並且你的MVC始終沒有出如今屏幕上,那viewDidLoad中的網絡調用就浪費了時間。而在viewWillAppear上作些花銷大的操做是值得的,由於視圖就要在屏幕上顯示
    • 能夠初始化視圖大小 這裏視圖的幾何信息已經肯定 可是幾何內容是能夠在viewWillAppear以後改變的,好比屏幕的旋轉,可是旋轉後並不會調用viewWillAppear,可是視圖幾何信息已經改變了,只能用其它方法

viewWillDisappear

- (void)viewWillDisappear:(BOOL)animated; 視圖將要消失
  1. 適用範圍
    • 暫停一些耗時操做(好比中止動畫);少佔用內存空間和CPU性能;很適合中止某項操做 記住當前狀態 以便在vieWillAppear中恢復

will對應的did已完成的版本方法

- (void)viewDidAppear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;

view{Will,Did}LayoutSubviews

- (void)view{Will,Did}LayoutSubviews; iOS6新出的當frame改變時調用的方法
  1. 使用場景
    • 當view的frame改變的時候會調用,當旋轉手機,幾何佈局就會改變
  2. 自動旋轉相關
    • shouldAutorotate 返回YES
    • supportedInterfaceOrientations返回一個新的方向(橫/豎屏) 須要設置支持的方向

didReceiveMemoryWarning

內存不足,發生內存警告時會調用
  1. 使用場景
    • 在內存不足的狀況下,視圖控制器會收到這個信息 內存不足不表明你的應用佔了很大內存,也許是手機上運行了太多應用剩下的可用內存很少,須要釋放一些空間,系統也許像不少應用發送了這個消息,是否生成這個警告徹底由系統決定
    • 收到警告,惟一要作的是試着釋放內存(堆中的內容)即將強指針置爲nil;展現圖片、播放音頻會佔用很大的內存
  2. 爲何要避免成爲內存大戶(圖像、視頻、音頻)
    • 若是系統認爲你的應用佔用了不少內存,系統能夠終止你的應用,從而形成程序的閃退,若是你合理使用內存,系統毫不會那樣
    • 用戶切換其餘應用時,但願獲得一樣多的內存,以便能流暢的運行,若是用戶每次運行你的應用,其餘應用就卡的不行,用戶對你的app所佔的內存有一個很差的印象,他們就會在應用商城AppStore差評你的app

awakeFromNib

從storyboard獲取任何元素包括controller;Nib是延續之前的名稱,你能夠理解爲awakeFromStoryboard
  1. 使用場景
    • 獲取storyboard的view元素
    • 通常來講這裏能夠實現初始化內容,可是這個時候你的輸出口尚未設好,因此初始化代碼最好放在viewDidLoad中。可是若是沒法將某些初始化操做放到viewDidLoad中執行,這時你能夠放在awakeFromNib中
    • 若是界面更復雜:用alloc/init來建立你的視圖控制器,init並非視圖控制器的指定初始化方法,但init能夠調用指定初始化方法,以下初始化模板:
eg.初始化模板
-(void) setup{}; //作一些沒法在viewDidLoad中執行的操做

- (void)awakeFromNib { [self setup]; } //調用setup

// UIViewController指定初始化方法
- (instancetype)initWithNibName:(NSString *)name bundle:(NSBundle *)bundle
{
    self = [super initWithNibName:name bundle:bundle];
    [self setup]; //調用setup
    return self;
}

PS:其實使用viewDidload也足夠了佈局

相關文章
相關標籤/搜索