我的初始视图控制器已加载,我需要初始化NSArray,我应该使用awakeFromNib
方法还是initWithCoder:
方法处理这个问题? awakeFromNib似乎工作得更好,因为我不需要返回任何东西,但是它的工作原理是nib文件曾经被用过了吗?我不想使用即将破解的方法。
initWithCoder:
只是看起来像:
- (id)initWithCoder:(NSCoder *)decoder {
if (self = [super initWithCoder:decoder]) {
self.articles = [[NSMutableArray alloc] init];
}
return self;
}
答案 0 :(得分:43)
-awakeFromNib
的要点是,当您可以确定已建立与笔尖中其他对象的所有连接时,您可以执行初始化。
nib加载基础结构向每个基础结构发送awakeFromNib消息 从nib存档重新创建的对象,但仅在所有对象之后 存档已加载并初始化。当一个对象收到 一个awakeFromNib消息,它保证有所有的插座和 行动关系已经建立。
不要忘记致电super
。
它不太可能很快消失,如果它做了这么多代码使用它,过渡期将会很长。是的,它的名称来自旧的“nib”文件格式,但this stack overflow question清除了文件扩展名的差异。
因此总结一下,在为类设置内部实例变量时,任何一种方法都适合您。请注意,在init
方法内部(包括-initWithCoder
),如果设置者依赖于完全初始化的类(源WWDC 2012视频移动到现代objective-c),则使用setter方法可能不安全。一个例子是设置一个引用nib文件中另一个对象的属性。
在UIViewController
子类-initWithCoder
中仅在从故事板加载时调用。无论您是否使用故事板,都会调用-awakeFromNib
,因此使用它可能更有意义。
你可以考虑的另一种模式是懒惰的吸气:
- (NSMutableArray *)articles{
if (_articles){
return _articles;
}
_articles = [[NSMutableArray alloc] init];
return _articles;
}
这种方法的好处是,如果您想对阵列进行进一步设置,您可以在不再需要时轻松丢弃该阵列,并在下次访问该属性时再次使用新阵列。< / p>