在自我之间分配的区别。并直接从ivar分配

时间:2011-09-27 15:30:22

标签: iphone objective-c ipad

  

可能重复:
  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(我假设)。 有时两种情况都会产生相同的效果,有时则不会。 那么做一个与另一个之间的关键主要区别是什么? 有人能解释清楚吗......

3 个答案:

答案 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以摆脱变量,这意味着我不需要预加载任何东西,所以我使用直接访问。这个例子很少出现,但是遵循这个约定并不需要花费任何费用。