我想知道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
在第一个片段,因为我希望它也崩溃(僵尸一切时... )在第二个释放消息。
在第二个,意想不到的事情发生。在初始化后调用任何消息(例如,layer.opaque = YES)会将保留计数器增加1,但只会增加消息的第一个调用。所以保留计数器总是从1到高。为了证明这不仅仅是一个数字问题,我使用了第二个版本。第二次发布后,图层只能从内存中释放。
这种行为也可以用autorelease产生。
那么,为什么向该图层的消息会增加其保留计数?我错过了关于保留和发布问题的一些信息吗?
在此先感谢
马尔科
感谢您的回答,但如果我忽略了这一点,我的应用程序会溢出内存。所以我必须查看哪些内存未被释放。我追查到这个问题。如果我释放所有CALayer两次,一切正常。即使是我的帖子中的第二个片段在单独测试时也能正常工作(不生成僵尸)。这个(鬼)保留只在CALayer中产生。 – marlu 2011-05-09 07:22:10