我应该在这里使用awakeFromNib还是initWithCoder?

时间:2013-03-19 18:49:50

标签: ios objective-c cocoa-touch

我的初始视图控制器已加载,我需要初始化NSArray,我应该使用awakeFromNib方法还是initWithCoder:方法处理这个问题? awakeFromNib似乎工作得更好,因为我不需要返回任何东西,但是它的工作原理是nib文件曾经被用过了吗?我不想使用即将破解的方法。

initWithCoder:只是看起来像:

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

    return self;
}

1 个答案:

答案 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>