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

Gre*_*reg 2 initialization properties objective-c conceptual

我知道这可能不一定适用于@properties,但它们将是最常见的用例.如果有,例如:

@property (strong) NSObject *object;

...

@synthesize object = _object;
Run Code Online (Sandbox Code Playgroud)

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

- (id)init {
    self = [super init];
    if (self) {
        _object = [[NSObject alloc] init];
    }
}
Run Code Online (Sandbox Code Playgroud)

或覆盖getter并在首次使用时初始化它:

- (NSObject *)object {
    if (!_object) {
        _object = [[NSObject alloc] init];
    }
    return _object;
}
Run Code Online (Sandbox Code Playgroud)

哪个更好用?这是否取决于使用场景(例如,声明属性的对象是否具有多个初始化器,或属性的类型,如何使用它等)?

我在覆盖getter时看到的真正优势是,只有在需要时才会分配属性,但缺点是第一次访问会更慢.

在一个侧面说明,在访问属性时init的方法,是能够更好地访问它们作为self.object_object

Ste*_*uda 5

与已接受的答案相反," 高级内存管理编程指南"说您应该在初始化器和dealloc方法中使用实例变量.请参阅"不要在初始化方法和dealloc中使用访问器方法".