初始化Objective-C属性的最佳实践

4

我知道这不一定仅适用于 @properties,但它们是最常见的用例。如果有一个例子:

@property (strong) NSObject *object;

...

@synthesize object = _object;

可以在声明它的类的init方法中进行初始化,如下所示:

- (id)init {
    self = [super init];
    if (self) {
        _object = [[NSObject alloc] init];
    }
}

或者覆盖getter,在第一次使用时进行初始化:

- (NSObject *)object {
    if (!_object) {
        _object = [[NSObject alloc] init];
    }
    return _object;
}

哪种更好用?这是否取决于使用场景(例如,声明属性的对象是否有多个初始化程序,属性的类型、使用方式等)?
我认为覆盖getter的真正优势在于只有在需要时才分配属性,但缺点是第一次访问速度较慢。
另外一件事,在init方法中访问属性时,最好使用self.object还是_object

1
在设置属性之前,在您的init方法中务必使用if (self) { - lnafziger
糟糕,已修复。谢谢您的注意。 在Xcode中我没有错过它,只是它不是我在这里谈论的内容之一,所以在盯着纯文本字段时,我忘记了它。 - Greg
2个回答

7

与普遍答案相反,高级内存管理编程指南指出,应该在初始化方法和dealloc方法中使用实例变量。请参见“不要在初始化方法和dealloc方法中使用访问器方法”。


1
11年来发生了很多事情。 - AndersK

2

个人认为在init方法中初始化更好,因为对象的生命周期更加明确。此外,如果初始化失败,最好在init时发现,而不是在获取时发现。

我也更喜欢使用self.object来表示属性,因为它使用对象的getter和setter,并且"self."使其更清晰,避免了需要或不需要保留的情况。当然,在某些情况下,比如你的示例中,这可能会导致多出几行代码,但我依赖编译器来优化代码。

例如:

yourobjclass* tmp = [[yourobjclass alloc] init];
self.object = tmp;
[tmp release];

如果您没有覆盖访问器,那么直接访问和通过属性访问之间是否有区别呢? - Greg
我总是访问该属性,但在init方法中,我读到有人说最好直接访问。所以我想知道。 - Greg
1
@PartiallyFinite 编程的一个目标是让其他程序员阅读你的代码时能够清楚你的意图,使用 self. 前缀可以明确对象应该如何处理,如果不这样做,在所有情况下是否进行保留并不总是显而易见。 - AndersK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接