为什么我从未调用过UIViewController的指定初始值设定项?

Pro*_*ber 3 iphone ipad

我使用基于视图的应用程序模板创建了一个新的Xcode项目.在视图控制器的.m中,我覆盖了这个:

// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization

        NSLog(@"initWithNibName...");
    }
    return self;
}


- (id)init {
    NSLog(@"initWithNibName...");
    return [super init];
}
Run Code Online (Sandbox Code Playgroud)

但是,我从来没有得到那个NSLog.这也是我从其他项目中获得的经验.永远不会调用此方法.甚至没有 - 来自NSObject.

View Controller在XIB文件中创建.怎么可能,Nib Loading System在没有任何初始化的情况下实例化这个类?

为什么?什么是替代而不是-loadView和-viewDidLoad?

远离XIB文件的另一个重要原因是什么?

jle*_*ehr 9

来自iOS 资源编程指南

在iPhone OS中,使用该initWithCoder:方法初始化符合NSCoding协议的任何对象.这包括它们的所有子类UIView以及UIViewController它们是否是默认Interface Builder库或您定义的自定义类的一部分.

可以这样想:在Interface Builder中首次创建视图控制器时,将调用指定的初始化程序.然后,当您保存nib文件时,视图控制器实例将存储在该文件中.稍后,当加载nib时,将从nib重新创建实例.

由于它是重新创建而不是第一次创建,因此使用了不同的初始化方法.此方法(-initWithCoder:)使用nib文件中的值恢复对象的状态,该值可包括超出指定初始值设置的属性的设置.这种机制依赖于NSCoding协议,它允许它一般用于许多不同的类.