UIViewController是iOS頂層視圖的載體及控制器踱蛀,用戶與程序界面的交互都是由UIViewController來控制的讯嫂,UIViewController管理UIView的生命周期及資源的加載與釋放。
UIView
經(jīng)常有同學(xué)問到獲取寬度或者坐標時到底用frame
還是 bounds
, 在這里說一下最主要的區(qū)別, 看情況使用.
UIView 的
frame
和bounds
屬性的區(qū)別
frame
: 相對于父視圖的大小和位置,x
和y
是當前 view 的坐標.
bounds
: 相對于自身位置的大小和位置,x
和y
永遠為0, 即屏幕原點 .
UIScreen
- 獲取帶有狀態(tài)欄的 Rect
CGRect bounds = [UIScreen mainScreen].bounds;
- 獲取不帶狀態(tài)欄的 Rect
CGRect bounds = [[UIScreen mainScreen] applicationFrame];
- 獲取狀態(tài)欄的位置和大小
CGRect rect = [[UIApplication sharedApplication] statusBarFrame];
執(zhí)行順序
- alloc -- 創(chuàng)建對象, 分配空間
- init -- 初始化對象, 初始化數(shù)據(jù)
- loadView -- 從 nib 載入視圖
- viewDidLoad -- 載入完成纲酗,可以進行自定義數(shù)據(jù)以及動態(tài)創(chuàng)建其他控件
注: 此方法只在 app 剛開始加載時調(diào)用一次,以后不會調(diào)用. - viewWillAppear -- 視圖將要出現(xiàn)在屏幕上
注: 此方法可以設(shè)置不同方向時設(shè)備如何顯示 - viewDidAppear -- 視圖已在屏幕上渲染完成
- viewWillDisappear -- 視圖將在屏幕上移除
- viewDidDisappear -- 視圖已經(jīng)移除
- dealloc -- 視圖被銷毀
內(nèi)存警告
當程序收到內(nèi)存警告的時候霍狰,會調(diào)用每一個ViewController的
didReceiveMemoryWarning
方法,我們需要做出相應(yīng)啄枕,釋放程序中暫時不需要的資源, 通常 vc 中系統(tǒng)已經(jīng)給我們重寫好了此方法, 但記得調(diào)用 super 方法.
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
if(ver >= 6.0f)
{
if(self.isViewLoaded && !self.view.window)
{
self.view = nil; //確保下次重新加載
}
}
}
上面的代碼先取得當前iOS系統(tǒng)的版本號
如果是iOS6.0或以上版本婚陪,進一步判斷
視圖是否被裝載進內(nèi)存
,并且是否為當前視圖
频祝,在這兩個條件都滿足(已經(jīng)裝載進內(nèi)存&&不是當前視圖)時,將self.view設(shè)置為nil脆淹,這樣就能保證再調(diào)用該ViewController時常空,loadView和viewDidLoad被再次調(diào)用。iOS3.0 - iOS6.0期間盖溺,didReceiveMemoryWarning方法會判斷當前ViewController的view是否顯示在window上漓糙,如果沒有顯示在window上,則didReceiveMemoryWarning會自動將ViewController的view以及其所有子view全部銷毀烘嘱,然后調(diào)用View Controller的viewDidUnload方法昆禽。