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

问题描述 投票:31回答:1

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

initWithCoder:看起来像:

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

    return self;
}
ios objective-c cocoa-touch
1个回答
44
投票

-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;
}

这种方法的好处是,如果您想对阵列进行进一步设置,您可以在不再需要时轻松丢弃阵列,下次访问该属性时,您将再次获得新阵列。

© www.soinside.com 2019 - 2024. All rights reserved.