我对有关在各种教程,文章,书籍等中浮动的setter的内存管理示例感到有些困惑。这是一个典型的变体:

- (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在哪里释放?这不是内存泄漏吗?

最佳答案

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

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


第三行的发行版平衡了第一行的分配,因为a和b都指向同一个对象。

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

oldAmount = [newAmount retain];


只是一些简写,意味着与以下内容相同:

oldAmount = newAmount;
[oldAmount retain];


除了保留和赋值以不同顺序发生(结果没有任何区别)之外。

理解这段代码中发生的事情是很好的,但是如果您将属性与综合访问器一起使用,则不必经常编写它。

10-08 12:01