initWithCoder, initWithNibName, viewDidLoad的區別

在學習iOS教程時,總會遇到初始化的問題,由於分不清initWithCoder, initWithNibName, viewDidLoad等方法的區別,導致學習一頭霧水。

在查閱資料之後,打算總結一下自己整理的資料。

定義:
1. initWithCoder: 將歸檔對象解檔過程中調用(也就是在加載nib過程中調用的)。其中歸檔對象包括nib。
這裏就涉及到歸檔(archive)以及nib等概念。
nib指的是IB(Interface Builder)下保存應用界面的文件,包括storyboard。
歸檔對象在我看來就是以某種形式存儲在文件中,包括nib。

2. awakeFromNib: 當所有在nib中的對象都實例化後調用的方法。

以上兩種方法都是利用stroyboard或者xib開發時纔會調用的,如果你純代碼編寫界面的話就會調用3.中的方法。
3.  initWithNibName:bundle: 在加載nib前調用,用於生成控制器的。

總結:
1)如果你用storyboard編寫界面,則調用順序爲initWithCoder -> awakeFromNib
2)如果你用純代碼編寫界面,則只調用了initWithNibName:bundle:

再說說application:didFinishLaunchingWithOptions: , viewDidLoad的定義和區別

application:didFinishLaunchingWithOptions:是在應用啓動並進行初始化時調用的,在此過程中會實例化根視圖控制器。
viewDidLoad 在視圖控制器被實例化後,視圖被加載到內存中時,會調用viewDidLoad方法。


我原以爲調用順序會是這樣
application:didFinishLaunchingWithOptions: ->initWithCoder -> awakeFromNib ->viewDidLoad

但是當我寫了一個簡單demo後說明我地猜想是錯誤的。
附上代碼和調用結果
//ViewController.m文件下

- (id)initWithCoder:(NSCoder *)aDecoder {
    
    if (self = [super initWithCoder:aDecoder]){
    
    }
    
    NSLog(@"initWithCoder");
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
    
    }
    NSLog(@"initWithNibName");
    return self;
}

- (void)awakeFromNib
{
    NSLog(@"awakeFromNib");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"viewDidLoad");
}

//AppDelegate.m文件下

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSLog(@"application:didFinishLaunchingWithOptions:");
    return YES;
}

最後調用的結果爲
2015-09-23 00:50:42.839 Order[3848:204656] initWithCoder
2015-09-23 00:50:42.840 Order[3848:204656] awakeFromNib
2015-09-23 00:50:42.842 Order[3848:204656] application:didFinishLaunchingWithOptions:
2015-09-23 00:50:42.844 Order[3848:204656] viewDidLoad

由於我使用的時storyboard,所以調用順序是
initWithCoder -> awakeFromNib -> application:didFinishLaunchingWithOptions: -> viewDidLoad

由於我沒有學習純代碼編寫界面,會的同學可以自己寫一下Demo,看一下結果。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章