我使用基于视图的应用程序模板创建了一个新的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文件的另一个重要原因是什么?
来自iOS 资源编程指南
在iPhone OS中,使用该
initWithCoder:方法初始化符合NSCoding协议的任何对象.这包括它们的所有子类UIView以及UIViewController它们是否是默认Interface Builder库或您定义的自定义类的一部分.
可以这样想:在Interface Builder中首次创建视图控制器时,将调用指定的初始化程序.然后,当您保存nib文件时,视图控制器实例将存储在该文件中.稍后,当加载nib时,将从nib重新创建实例.
由于它是重新创建而不是第一次创建,因此使用了不同的初始化方法.此方法(-initWithCoder:)使用nib文件中的值恢复对象的状态,该值可包括超出指定初始值设置的属性的设置.这种机制依赖于NSCoding协议,它允许它一般用于许多不同的类.
| 归档时间: |
|
| 查看次数: |
3716 次 |
| 最近记录: |