的重点-awakeFromNib
是,当您可以确定与 nib 中其他对象的所有连接都已建立时,您可以执行初始化操作。
nib 加载基础架构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 awakeFromNib 消息时,它保证已经建立了它的所有出口和动作连接。
别忘了打电话super
。
它不太可能很快消失,如果它做了这么多代码使用它,那么过渡期就会很长。是的,它的名字来自旧的“nib”文件格式,但这个堆栈溢出问题清除了文件扩展名的差异。
因此,总而言之,当您为类设置内部实例变量时,任何一种方法都适用于您。请注意,在init
方法内部(包括-initWithCoder
),如果 setter 依赖于完全初始化的类(源 WWDC 2012 video move to modern objective-c),使用您的 setter 方法可能不安全。一个例子是设置一个引用 nib 文件中另一个对象的属性。
In UIViewController
subclasses-initWithCoder
仅在从情节提要加载时调用。-awakeFromNib
不管你是否使用故事板,使用它可能更有意义。
您可以考虑的另一种模式是lazy-getter:
- (NSMutableArray *)articles{
if (_articles){
return _articles;
}
_articles = [[NSMutableArray alloc] init];
return _articles;
}
这种方法的好处是,如果您想对阵列进行进一步的设置,您可以在不再需要阵列时轻松丢弃阵列,并且在下次访问该属性时再次获得一个新的阵列。