我想知道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到高。为了证明这不仅仅是一个数字问题,我使用了第二个版本。第二次发布后,该层将仅从内存中释放。
这也可以通过自动释放产生。
那么,为什么到该层的消息会增加其保留计数?我是否遗漏了有关保留和发布问题的一些信息?
提前致谢
马
答案 0 :(得分:1)
你错过了关于不使用保留计数进行调试的部分。不要这样做。对象的保留计数与您的业务无关。
专注于您对象的所有权。如果您拥有它(保留,分配,复制或新建),则必须将其释放一次。
如果在您完成保留/释放循环后对象仍然存在,这意味着其他人拥有它并负责释放它。如果你再次发布它,你就已经破坏了所有权,而这种所有权只能以悲惨的方式结束。
因此,如果layer.opaque = YES
增加了保留计数,那么就让它。别担心。你已经履行了你的义务,做其他任何事情都会使其他地方的保留/释放周期失去平衡。
答案 1 :(得分:1)
那么,为什么要向图层发送消息 增加保留数?我错过了吗 关于保留和保留的一些信息 发布问题?
因为它是框架的内部实现细节。
如果您平衡了保留和释放,那么您的对象将被正确释放。
如果某个对象粘贴的时间太长(足以导致您的应用崩溃),那是因为您的代码没有正确清理。对于图层,最常见的原因是当您的应用完成后,无法从图层/视图层次结构中删除图层。