iOS内存管理问题

时间:2011-03-09 05:25:10

标签: objective-c ios memory-management

关于有关各种教程,文章,书籍等的知识库的内存管理示例,我有点困惑。这是一个典型的变体:

- (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 个答案:

答案 0 :(得分:2)

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

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

第三行上的释放平衡了第一行的alloc,因为a和b都指向同一个对象。

在你的例子中也是如此。保留newAmount,但指定oldAmount指向同一对象。下次调用-setOldAmount :(或-dealloc)时,将释放该对象。请注意:

oldAmount = [newAmount retain];

只是一个简写,意思是:

oldAmount = newAmount;
[oldAmount retain];

除了保留和分配以不同的顺序发生(结果没有任何差别)。

理解这段代码中发生了什么是很好的,但是如果你使用带有合成访问器的属性,你就不必经常写它。

答案 1 :(得分:0)

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