轉自:http://blog.csdn.net/zhz459880251/article/details/49003107
/**
初始化UIViewController,執行關鍵數據初始化操作,注意這里不要做view相關操作,view在loadView方法中才初始化,這時loadView還未調用。
*/
/**
如果使用StoryBoard進行視圖管理,程序不會直接初始化一個UIViewController,StoryBoard會自動初始化或在segue被觸發時自動初始化,因此方法initWithNibName:bundle:不會被調用。
*/
//1.如果用代碼創建, 調用
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nil bundle:nil]) {
}
return self;
}
/**
如果在代碼里面使用instantiateViewControllerWithIdentifier:方法顯示初始化一個UIViewController,則initWithCoder方法會被調用
*/
//1.如果用xib, 或 SB創建, 調用
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
NSLog(@"123");
}
return self;
}
/**
初始化view, 這時候調用self.view會無限循環, 除非先調用了[supper loadView]
如果沒有重載loadView方法,則UIViewController會從nib或StoryBoard中查找默認的loadView,默認的loadView會返回一個空白的UIView對象。
如果重載loadView方法, 這需先調用[supper loadView], 否則控件不顯示
*/
//2.
- (void)loadView {
[super loadView];
self.view.backgroundColor = [UIColor grayColor];
}
/**
當VC的view對象載入 內存 后調用,用于對view進行額外的初始化操作
*/
//3.
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor greenColor];
self.myButton.backgroundColor = [UIColor greenColor];
}
/**
在view即將添加到視圖層級中(顯示給用戶)且任意顯示動畫切換之前調用(這個時候supperView還是nil)。這個方法中完成任何與視圖顯示相關的任務,例如改變視圖方向、狀態欄方向、視圖顯示樣式等
*/
//4.
- (void)viewWillAppear:(BOOL)animated {
self.view.backgroundColor = [UIColor redColor];
}
/**
view即將布局其Subviews。比如view的bounds改變了(例如狀態欄從不顯示到顯示,視圖方向變化),要調整Subviews的位置,在調整之前要做的一些工作就可以在該方法中實現。
*/
//5.
- (void)viewWillLayoutSubviews {
//[super viewWillLayoutSubviews];
self.myButton.backgroundColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.8 alpha:1.0];
}
/**
view已經布局其Subviews。比如view的bounds改變了(例如狀態欄從不顯示到顯示,視圖方向變化),已經調整Subviews的位置,在調整完成之后要做的一些工作就可以在該方法中實現。
*/
//6.
- (void)viewDidLayoutSubviews {
//[super viewDidLayoutSubviews];
self.myButton.backgroundColor = [UIColor grayColor];
}
/**
在view被添加到視圖層級中,顯示動畫切換之后調用(這時view已經添加到supperView中)。在這個方法中執行視圖顯示相關附件任務,如果重載了這個方法,必須在方法中調用[supper viewDidAppear];
*/
//7.
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.view.backgroundColor = [UIColor blueColor];
}
//------------------------移除 視圖------------------------
/**
view即將從superView中移除且移除動畫切換之前,此時還沒有調用removeFromSuperview。
*/
//1.
- (void)viewWillDisappear:(BOOL)animated {
NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}
/**
view從superView中移除,移除動畫切換之后調用,此時已調用removeFromSuperview。
*/
//2.在下一個視圖的viewWillAppear: 調用之后, viewDidAppear:調用之前才調用
- (void)viewDidDisappear:(BOOL)animated {
NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}
ios6.0以后被廢棄
- (void)viewWillUnload {
NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}
- (void)viewDidUnload {
NSLog(@"%s ,%d", __FUNCTION__, __LINE__);
}
補充:
initWithNibName:bundle:
如果是通過調用initWithNibName:bundle指定nib文件名初始化的話,ViewController會根據此nib來創建View。如果name參數為nil,則ViewController會通過以下兩個步驟找到與其關聯的nib:
1)如果ViewController的類名以“Controller”結尾,例如ViewController的類名是MyViewController,則查找是否存在MyView.nib;
2)找跟ViewController類名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib
loadView
當訪問UIViewController的view屬性時,view如果此時是nil,那么VC會自動調用loadView方法來初始化一個UIView并賦值給view屬性。此方法用在初始化關鍵view,需要注意的是,在view初始化之前,不能先調用view的getter方法,否則將導致死循環(除非先調用了[supper loadView];)。
-(void)loadView{
NSLog(@"loadView");
//錯誤,將導致死循環,因此此時view=nil,VC會再次調用loadView來初始化view
self.view.backgroundColor=[UIColor greenColor];
}
-(void)loadView{
NSLog(@"loadView");
//正確,先初始化view
self.view=[[MyView alloc]init];
self.view.backgroundColor=[UIColor greenColor];
}
當一個視圖被移除屏幕并且銷毀的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear 視圖將被從屏幕上移除之前執行
2、viewDidDisappear 視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放