关于有关各种教程,文章,书籍等的知识库的内存管理示例,我有点困惑。这是一个典型的变体:
- (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在哪里发布?这不是内存泄漏吗?
答案 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,那么可能会出现内存泄漏,但上面的代码是正确的。