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

Iphone 为什么从未调用UIViewController的指定初始值设定项my?,iphone,ipad,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 = [

我用基于视图的应用程序模板创建了一个新的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];
}
然而,我从未得到过那个NSLog。这也是我在其他项目中的经验。永远不会调用此方法。非偶数-从NSObject初始化

视图控制器是在XIB文件中创建的。Nib加载系统在没有任何初始化的情况下实例化这个类,这怎么可能呢

为什么??还有什么替代-loadView和-viewDidLoad的方法呢


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

您可以使用-awakeFromNib来实现这一点。
只有在代码中这样做时才会调用init。

是否已将主窗口的委托设置为appDelegate。。? 在AppDelegate中实现
UIApplicationDelegate
,并在
ApplicationIDFinishLaunching
方法中,尝试
initWithNibName
。 这样就可以了。

来自iOS

在iPhone操作系统中,任何符合NSCoding协议的对象都将使用
initWithCoder:
方法初始化。这包括
UIView
UIViewController
的所有子类,无论它们是默认界面生成器库的一部分还是您定义的自定义类

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


因为它是重新创建的,而不是第一次创建的,所以使用了不同的初始化方法。此方法(
-initWithCoder:
)使用nib文件中的值恢复对象的状态,该文件可以包括指定初始值设定项设置之外的属性设置。此机制依赖于
NSCoding
协议,该协议允许它在许多不同的类中通用工作。

感谢您的提示!但是无论如何,Nib加载程序怎么可能在不进行任何初始化的情况下创建此类的实例呢?从Nib(或另一个NSCoding归档)加载的所有对象都是用
-initWithCoder:
初始化的。这是有道理的,但为什么从未调用-init呢?它是NSObject的指定初始值设定项…-awakeFromNib不是初始值设定项,它属于视图控制器生命周期,可以多次调用(特别是在处理内存警告时;视图控制器可能会释放视图并在以后重新构建它们)。请注意,如果您使用nib并通过直接调用initWithNibName:bundle:实例化视图控制器,则会调用initWithNibName:bundle:。只是现在你通常使用故事板,在这种情况下,它会调用initWithCoder:来代替。在故事板之前,我猜默认的基于Xcode项目视图的应用程序模板没有调用initWithNibName:bundle:来实例化初始视图控制器。@LironYahdav如果你重新阅读这个问题,你会注意到它声明视图控制器在nib文件中,因此,加载nib时无法调用
initWithNibName:bundle: