可能重复:
When to use self on class properties?
Difference between self.ivar and ivar?
我知道你做的时候
self.array = [[NSMutableArray alloc] init];
这意味着我正在调用setter方法。 但是,我也可以这样做:
array = [[NSMutableArray alloc] init];
直接分配ivar,没有调用setter(我假设)。 有时两种情况都会产生相同的效果,有时则不会。 那么做一个与另一个之间的关键主要区别是什么? 有人能解释清楚吗......
答案 0 :(得分:1)
如果保留array
属性,则第一个属性将导致内存泄漏。在这种情况下,您在一行中获得两次所有权,一次通过alloc获得,一次通过保留属性获得。所以一个版本是不够的。
如果你在alloc之后立即发布,那么在第二个中你会立即失去所有权,因为在这种情况下你没有保留array
。
答案 1 :(得分:0)
关键的区别在于,setter可能会产生额外的副作用 - 例如保留参数或发出KVO通知 - 而简单的赋值则不能。
答案 2 :(得分:0)
Objective-C编程语言告诉您在initializer:
中使用直接访问有几个适用的约束和约定 初始化方法不适用于其他方法:
- 如果设置实例变量的值,通常会这样做 使用直接赋值而不是使用访问器方法。直接 分配避免了触发不必要的副作用的可能性 在访问者中。
并在dealloc中:
通常在dealloc方法中,您应该释放对象实例 变量直接(而不是调用set访问器和传递 nil作为参数),如本例所示:
- (void)dealloc { [property release]; [super dealloc]; }
要像Chuck所说的那样避免像KVO通知这样的副作用。
示例:在我的代码中,我有一个变量,可以提前触发相关数据的预加载。有时我发布它或将其设置为nil以摆脱变量,这意味着我不需要预加载任何东西,所以我使用直接访问。这个例子很少出现,但是遵循这个约定并不需要花费任何费用。