关于保留和释放问题的困惑

时间:2011-05-09 05:31:33

标签: iphone objective-c retain

我想知道CALayer类及其引用计数器的行为。请参阅以下两个代码段:

首先:

CALayer *layer = [[CALayer alloc] init];
NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 1
[layer release]; // no problem so far

[layer release]; // this leads to a crash as expected

第二

CALayer *layer = [[CALayer alloc] init];

NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 1
layer.opaque = YES; //increases the retain count, WHY?!?
NSLog(@"retain count: %d",  [layer retainCount]); // log: retain count: 2

[layer release]; // no problem so far

[layer release]; // this leads NOT to a crash as expected

在第一个片段中,一切都按照我的预期发生,也发生在第二个发布消息的崩溃(僵尸......)。

在第二个中,意外的事情发生了。在init之后调用任何消息(例如,layer.opaque = YES)将保留计数器增加1,但仅增加消息的第一次调用。所以保留计数器总是从1到高。为了证明这不仅仅是一个数字问题,我使用了第二个版本。第二次发布后,该层将仅从内存中释放。

这也可以通过自动释放产生。

那么,为什么到该层的消息会增加其保留计数?我是否遗漏了有关保留和发布问题的一些信息?

提前致谢

2 个答案:

答案 0 :(得分:1)

你错过了关于不使用保留计数进行调试的部分。不要这样做。对象的保留计数与您的业务无关。

专注于您对象的所有权。如果您拥有它(保留,分配,复制或新建),则必须将其释放一次。

如果在您完成保留/释放循环后对象仍然存在,这意味着其他人拥有它并负责释放它。如果你再次发布它,你就已经破坏了所有权,而这种所有权只能以悲惨的方式结束。

因此,如果layer.opaque = YES增加了保留计数,那么就让它。别担心。你已经履行了你的义务,做其他任何事情都会使其他地方的保留/释放周期失去平衡。

答案 1 :(得分:1)

retainCount没用。不要打电话。

  

那么,为什么要向图层发送消息   增加保留数?我错过了吗   关于保留和保留的一些信息   发布问题?

因为它是框架的内部实现细节。

如果您平衡了保留和释放,那么您的对象将被正确释放。

如果某个对象粘贴的时间太长(足以导致您的应用崩溃),那是因为您的代码没有正确清理。对于图层,最常见的原因是当您的应用完成后,无法从图层/视图层次结构中删除图层。