自我分配之间的区别。和伊娃分配直接

问题描述:

可能重复:
When to use self on class properties?
Difference between self.ivar and ivar?自我分配之间的区别。和伊娃分配直接

我知道,当你做

self.array = [[NSMutableArray alloc] init]; 

这意味着我打电话setter方法。 不过,我也可以这样做:

array = [[NSMutableArray alloc] init]; 

这是直接分配伊娃,没有setter方法被调用(我认为)。 有时这两种情况下都会有同样的效果,有时没有。 所以做了另一种之间的关键主要区别是什么? 有人可以解释清楚..

+0

这已被问了很多很多很多次。请做一个搜索:http://*.com/search?q=%5Bobjc%5D+access+property+self&submit=search或http://*.com/search?q=%5Bobjc%5D+self.ivar +伊娃&提交=搜索 –

如果array属性被保持则第一人会导致内存泄漏。在这种情况下,您在一行中获得两次所有权,一次通过alloc,一次通过保留财产。所以一个版本是不够的。

而在第二个一个,如果你的alloc后立即释放,那么你立即失去所有权,你有没有在这种情况下,保留array

关键的区别是,制定者可以有其他副作用 - 如保留参数或发出KVO通知 - 而简单的任务不能。

的Objective-C编程语言告诉你使用在initializer直接访问:

有适用于 初始化方法,并不适用于其他方法的几个约束条件和约定:

  • 如果您设置实例变量的值,则通常使用直接分配而不是使用访问器方法来执行 。直接 分配避免了存取引发不必要的副作用 的可能性。

dealloc:如图

在dealloc方法应直接 变量释放对象实例(而不是调用一组访问和传递 零作为参数)

通常,这个例子:

- (void)dealloc { 
    [property release]; 
    [super dealloc]; 
} 

避免,如夹头说像KVO通知的副作用。

例如:在我的代码中,我有一个事先触发相关数据预加载的变量。有时我释放它或将它设置为零来摆脱变量,这意味着我不需要预先加载任何东西,所以我使用直接访问。这个例子很少出现,但遵循这个约定并不需要花费任何东西。