我制作了一个测试应用程序来了解 init 方法的工作原理。在我的简单 UIViewController
我称之为:
- (id)init {
self = [super init];
self.propertyArray = [NSArray new];
NSLog(@"init called");
return self;
}
上面没有打印 NSLog 中的任何值。但是,当我写:
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
NSLog(@"init called");
self.propertyArray = [NSArray new];
return self;
}
它确实在控制台中打印“init call”。所以我的问题是:为什么调用 init 方法而另一个没有?当我想在 View 加载(以及任何其他调用的方法)之前做我的事情时,我必须使用哪一个?
任何解释将不胜感激,谢谢。
最佳答案
首先,您在问题中提到了 ViewController。 UIViewController 的指定初始化器是 initWithNibName:bundle:
你永远不想只覆盖 UIViewController 上的 init。
每个对象都有一个生命周期:
在代码中初始化时,您有指定的初始化程序。您可以在该类的文档中找到它。对于 NSObject 派生类,这将是 init:
- (id)init
{
self = [super init];
if (self) {
// perform initialization code here
}
return self;
}
使用 NSKeyUnrchiving 反序列化的所有对象(在 Storyboard 或 NIB(XIB)的情况下会发生这种情况)都会被解码。此过程使用 initWithCoder 初始化程序并在取消归档过程中发生:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// perform initialization code here
}
return self;
}
由于这个生命周期,创建一个从每个初始化程序调用的共享初始化程序是很常见的:
- (void)sharedInit
{
// do init stuff here
}
- (id)init
{
self = [super init];
if (self) {
[self sharedInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self sharedInit];
}
return self;
}
更进一步。在 Storyboard 和 XIB 的情况下,如果您想在取消归档完成后执行初始化或更新并确保所有导出和操作都已连接,您可以使用 awakeFromNib:
- (void)awakeFromNib
{
// do init or other stuff to be done after class is loaded from Interface Builder
}
关于ios - 关于使用 init 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24761444/