使用decodeObjectForKey时理解retainCounts:

时间:2012-02-20 05:43:53

标签: objective-c ios memory-management nscoding retaincount

我有一个奇怪的情况,我希望有人能说清楚。我在自定义对象中实现了NSCoding协议,我在initWithCoder:中遇到了内存泄漏问题。我有这样的事情:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
if(titleTemp) {
    [self setTitleString:titleTemp];
} else {
    [self setTitleString:[NSString string]];
}

我有很多这个对象的其他属性,有些是数组,有些是字符串,还有一些基元(双打,整数),而且我一直在这个方法中得到内存泄漏。 Instruments告诉我,decodeObjectForKey:线上的每次解码都会发生泄漏。当您在10个以上对象的数组中泄漏每个自定义类中的每个解码对象时,内存开始累加。

但真正令我难过的是这段代码的输出:

NSString* titleTemp = [aDecoder decodeObjectForKey:@"title"];
NSLog(@"%i", titleTemp.retainCount);

是“3”!

哇,所有这些保留来自哪里?甘拜下风。但我很想知道所有这些泄漏。谢谢!

2 个答案:

答案 0 :(得分:2)

阅读本文:http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/。他是对的。这对您来说意味着您需要遵循Cocoa的内存管理规则,同时忽略retainCount返回的值。确保您拥有releaseautorelease每个对象,或者是因为您保留了该对象,或者是因为您从以initnew,{{开头的方法获得了该对象1}}或copy。此外,您的发布/自动发布需要与您自己的引用平衡。因此,如果您保留一次对象,则只能释放一次。

在您的具体案例中,问题似乎不在您发布的小片段中。但重要的是,您不应该使用retainCount进行调试。

答案 1 :(得分:2)

  

哇,所有这些保留来自哪里?

很难说你是否看不到正在保留的代码,但只要它不是你的代码那么你就不必担心它。很有可能-decodeObjectForKey:实际上调用了其他几个方法来创建字符串,其中任何一个方法都可以保留并随后自动释放该字符串。

  

打败我。但我很想知道所有这些泄漏事件。

不要试图使用-retainCount来查找泄漏,而是查看泄漏的对象。仪器可以帮助您做到这一点。确保您正在平衡这些对象的保留(以及当然的分配,复制和新增)和版本。如果您过度保留或未释放物体,则会导致泄漏。如果您控制之外的某些代码正在执行此操作,那么您无论如何都无法做到这一点。