2

我知道这可能不一定只适用于@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

4

2 回答 2

5

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

于 2014-02-17T21:51:41.300 回答
2

我个人发现在 init 方法中初始化更好,对象的预期寿命会更加清晰,并且还要考虑对象的 init 是否失败,在 init 中获取它不是比在获取时更好吗?

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

例如

yourobjclass* tmp = [[yourobjclass alloc] init];
self.object = tmp;
[tmp release];
于 2012-05-26T04:57:22.757 回答