2011-03-09 94 views
0

我有点困惑关于制定者漂浮在各种教程,文章,书籍等,下面是一个典型的变型的内存管理的例子:iOS的内存管理问题

- (void) setOldAmount: (NSNumber*)newAmount 
{ 
    if (oldAmount != newAmount) { 
    [oldAmount release]; 
    oldAmount = [newAmount retain]; 
    } 
} 


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

随着oldAmount = [newAmount retain]; oldAmount的消息-retain ,由-dealloc中的-release消息平衡;但是如果newAmount正在发送-retain然后分配给oldAmount,newAmount在哪里发布?这不是内存泄漏吗?

回答

2

newAmount和oldAmount都是指向对象的指针。您通过指针保留并释放对象,但它是跟踪它保留了多少次的对象。指向同一对象的两个变量可以互换使用。例如:

NSNumber *a = [[NSNumber alloc] initWithInt:5]; 
NSNumber *b = a; 
[b release]; 

由于a和b都指向相同的对象,因此第三行的版本会平衡第一行的alloc。

在你的例子中是一样的。 newAmount被保留,但oldAmount被分配指向同一个对象。下一次调用setOldAmount:(或-dealloc)时,该对象将被释放。需要注意的是:

oldAmount = [newAmount retain]; 

只是有点速记的,这意味着同样的事情:

oldAmount = newAmount; 
[oldAmount retain]; 

除了保留并以不同的顺序分配发生(不使任何区别结果)。

很好理解此代码中发生了什么,但如果您使用具有合成访问器的属性,则不必经常写它。

0

您必须从所有权角度考虑iPhone内存管理。如果你拥有一个变量的所有权,你需要“保留”它。如果你保留一个对象,你需要释放它。所以你看不到的代码是调用setOldAmount的人。无论谁调用setOldAmount最有可能创建newAmount。当你分配一个变量时,它隐式设置为在给予你之前保留(否则它将在它到达你之前被释放,这将是愚蠢的)。当你不再关心它的价值时,释放它是你的工作。所以是的,如果谁调用setOldAmount从不发布newAmount,但是上面的代码是正确的,那么可能会发生内存泄漏。