我应该在这里使用awakeFromNib还是initWithCoder?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该在这里使用awakeFromNib还是initWithCoder?相关的知识,希望对你有一定的参考价值。
我的初始视图控制器已加载,我需要一个NSArray初始化,我应该在awakeFromNib
方法或initWithCoder:
方法中处理这个问题吗? awakeFromNib似乎工作得更好,因为我不需要返回任何东西,但是它的工作原理是nib文件曾经被用过了吗?我不想使用即将破解的方法。
initWithCoder:
看起来像:
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
self.articles = [[NSMutableArray alloc] init];
}
return self;
}
-awakeFromNib
的重点在于,当您可以确定已建立与nib中其他对象的所有连接时,您可以执行初始化操作。
nib加载基础结构将awakeFromNib消息发送到从nib归档重新创建的每个对象,但只有在归档中的所有对象都已加载并初始化之后。当一个对象收到一个awakeFromNib消息时,它保证已经建立了所有的插座和动作连接。
别忘了打电话给super
。
它不太可能很快消失,如果它做了这么多代码使用它,过渡期将很长。是的,它的名字来自旧的“nib”文件格式,但this stack overflow question清除了文件扩展名的差异。
因此总之,在为类设置内部实例变量时,任何一种方法都适合您。请注意,在init
方法(包括-initWithCoder
)中,如果setter依赖于完全初始化的类(源WWDC 2012视频移动到现代objective-c),则使用setter方法可能不安全。一个例子是设置一个引用nib文件中另一个对象的属性。
在UIViewController
子类中,-initWithCoder
仅在从故事板加载时调用。由于-awakeFromNib
被称为是否使用故事板,因此使用它可能更有意义。
你可以考虑的另一个模式是懒惰的:
- (NSMutableArray *)articles{
if (_articles){
return _articles;
}
_articles = [[NSMutableArray alloc] init];
return _articles;
}
这种方法的好处是,如果您想对阵列进行进一步设置,您可以在不再需要时轻松丢弃阵列,下次访问该属性时,您将再次获得新阵列。
以上是关于我应该在这里使用awakeFromNib还是initWithCoder?的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用哪个,-awakeFromNib 还是 -viewDidLoad?