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

时间:2012-05-26 04:18:33

标签: objective-c properties initialization conceptual

我知道这可能不一定适用于@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访问它们吗?

2 个答案:

答案 0 :(得分:5)

与接受的答案相反,Advanced Memory Management Programming Guide表示你应该在初始化器和dealloc方法中使用实例变量。请参阅“不要在初始化方法和dealloc中使用访问器方法”。

答案 1 :(得分:2)

个人我发现初始化在init方法中更好,对象的预期寿命更加清晰,并且还考虑init是否为对象失败,是不是在初始化时比在你做的时候更好一个得到?

我也更喜欢使用self.object作为属性,因为它使用了对象的getter和setter以及“self”。明确并避免需要保留的情况。确实在某些情况下,例如在您的示例中,它可能会导致更多行代码,但我依靠编译器来优化代码。

e.g。

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