gpt4 book ai didi

objective-c - iOS内存管理问题

转载 作者:行者123 更新时间:2023-11-28 23:17:45 24 4
gpt4 key购买 nike

我对各种教程、文章、书籍等中关于 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];

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

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

关于objective-c - iOS内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com