2011-05-09 71 views
0

我想知道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产生。

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

在此先感谢

马尔科

回答

1

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

专注于您对物体的所有权。如果您拥有它(保留,分配,复制或新建),则必须发布一次。

如果在您完成保留/释放循环之后,某个对象仍然存在,那意味着其他东西拥有它并负责释放它。如果你再次释放它,你已经打破了所有权,只能悲惨地结束。

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

+0

感谢您的回答,但如果我忽略了这一点,我的应用程序会溢出内存。所以我必须查看哪些内存未被释放。我追查到这个问题。如果我释放所有CALayer两次,一切正常。即使是我的帖子中的第二个片段在单独测试时也能正常工作(不生成僵尸)。这个(鬼)保留只在CALayer中产生。 – marlu 2011-05-09 07:22:10

1

retainCount没用。别叫它。

那么,为什么消息到层 增加其保留数?我有没有错过 一些Infromation约保留和 发行问题?

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

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

如果一个对象时间太长(足以导致应用程序崩溃),这是因为您的代码没有正确清理。在图层的情况下,最常见的原因是在您的应用完成后,未能从图层/视图层次结构中移除图层。