2012-02-20 84 views
2

有二传手的例子很多,我们应该怎么做,例如:不必要地释放

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     [foo release];//?? 
     foo = [newFoo retain]; 
    } 
} 

我的理解是,我们需要释放上一个值,然后分配新的有保留,这是怎么文档说我们要做,但我不明白我们应该发布什么,如果分配foo = [newFoo retain];会使foo成为newFoo当前保留计数器的新值,如果甚至foo的保留计数器在5之前,它就会变成newFoo的+1,或者我有些想法和理解不正确。为什么我们不能这样做:

- (void)setFoo:(NSString *)newFoo 
{ 
    if (foo != newFoo) 
    { 
     foo = [newFoo retain]; 
    } 
} 

回答

1

Objective-C与指针(一切都是指针)一起工作。

当您执行retainrelease时,您不是在引用/指针(您的变量名称)上执行此操作,而是在实际对象本身上执行此操作。这就是为什么我们需要释放旧对象(因为我们已经完成了它),并将我们的变量指向新的对象(然后增加它的retain计数,所以它不会被别的东西去除) 。

希望是有道理

+0

哦,10倍,我明白了。事实上,我们需要释放的不是var,而是内存单元 – 2012-02-20 19:35:03

0

foo是一个指针(存储器地址)指向存储在存储器中一个NSString对象。当这个setter函数启动时,内存中有两个NSString对象:一个被指向并由foo保留,另一个被作为参数传入。每个对象都有自己的保留计数。

foo == newFoo告诉指针停止指向旧的NSString,并开始指向新的NSString。

如果在更改指针之前未释放第一个对象,则会导致内存泄漏。旧的对象不会有任何指向它的东西(所以它不存在,只要你的程序知道),但它的保留计数将永远不会达到0,并且因为它仍然被保留而被取消分配。

+0

10x,听起来不错,倒掉我的脑袋 – 2012-02-20 19:38:32