我应该在这里使用awakeFromNib或initWithCoder吗?

我最初的视图控制器被加载,我需要一个NSArray被初始化,我应该照顾在awakeFromNib方法或initWithCoder:方法? awakeFromNib似乎工作更好,因为我不需要返回任何东西,但它的工作原理是以前使用的笔尖文件是正确的? 我不想用一种很快就会破的方法。

并将initWithCoder:只是看起来像:

 - (id)initWithCoder:(NSCoder *)decoder { if (self = [super initWithCoder:decoder]) { self.articles = [[NSMutableArray alloc] init]; } return self; } 

-awakeFromNib在于,您可以在确定与笔尖中其他对象的所有连接都已经build立的情况下执行初始化操作。

nib加载基础结构将一个awakeFromNib消息发送到从nib存档重新创build的每个对象,但仅在存档中的所有对象都已加载并初始化之后。 当一个对象收到一个awakeFromNib消息时,保证所有的出口和动作连接已经build立。

不要忘记打电话给super

它不可能很快消失,如果它做了太多的代码使用它,过渡期将是漫长的。 是的,它的名字来自旧的“nib”文件格式,但是这个堆栈溢出问题清除了文件扩展名中的差异。

所以总之,任何方法都可以为你工作,因为你正在为这个类设置一个内部的实例variables。 请注意,在init方法(包括-initWithCoder )中,如果setter方法依赖完全初始化的类(源WWDC 2012video移至现代objective-c),那么使用setter方法可能并不安全。 一个例子是设置一个引用nib文件中另一个对象的属性。

UIViewController子类中,仅在从故事板加载时调用-initWithCoder。 as -awakeFromNib被称为是否使用故事板或使用它可能会更有意义。

你可以考虑的另一种模式是懒惰吸气剂:

 -(NSMutableArray *)articles{ if (_articles){ return _articles; } _articles = [[NSMutableArray alloc] init]; return _articles; } 

这种方法的好处是,如果你想进一步设置arrays,你可以很容易地丢弃arrays,当你不需要它了,下一次你访问属性,你有一个新的一次。