iOS 内存管理问题

标签: ios Objective-C
发布时间: 2017/3/21 22:45:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我感到有点困惑的内存管理例子关于二传手漂浮在各种教程、 文章、 书籍等。这里是一个典型的变种︰

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


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

oldAmount = [newAmount retain]; oldAmount 的-保留消息,平衡-释放消息在-dealloc; 但如果正在发送 newAmount-保留,然后分配给 oldAmount,那里 newAmount 释放了吗?这难道不是内存泄漏?

解决方法 1:

newAmount 和 oldAmount 是两个指向对象的指针。你保留和释放对象通过指针,但它保留了,持续追踪如何多次它的对象。指向同一对象的两个变量可以互换使用。例如︰

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

在第三行释放平衡分配的第一行上因为和 b 都指向相同的对象。

它是在您的示例中一样。newAmount 被保留,但 oldAmount 指派指向相同的对象。接下来的时间 setOldAmount: (或-dealloc) 是调用,该对象将被释放。请注意︰

oldAmount = [newAmount retain];

只是有点的简写形式,作为相同的意思︰

oldAmount = newAmount;
[oldAmount retain];

除了保留和转让发生在不同的顺序 (这并不使任何差异的结果)。

它是好的去理解什么发生在这段代码,但如果您使用属性合成访问器就不必经常写信。

官方微信
官方QQ群
31647020