我对有关在各种教程,文章,书籍等中浮动的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];
除了保留和赋值以不同顺序发生(结果没有任何区别)之外。
理解这段代码中发生的事情是很好的,但是如果您将属性与综合访问器一起使用,则不必经常编写它。