我知道这可能不一定适用于@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
访问它们吗?
答案 0 :(得分:5)
与接受的答案相反,Advanced Memory Management Programming Guide表示你应该在初始化器和dealloc方法中使用实例变量。请参阅“不要在初始化方法和dealloc中使用访问器方法”。
答案 1 :(得分:2)
我也更喜欢使用self.object
作为属性,因为它使用了对象的getter和setter以及“self”。明确并避免需要保留的情况。确实在某些情况下,例如在您的示例中,它可能会导致更多行代码,但我依靠编译器来优化代码。
e.g。
yourobjclass* tmp = [[yourobjclass alloc] init];
self.object = tmp;
[tmp release];