0

我有一个奇怪的情况,我希望有人能解释一下。我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”!

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

4

2 回答 2

2

阅读:http ://www.friday.com/bbum/2011/12/18/retaincount-is-useless/ 。他是对的。这对您来说意味着您需要遵循 Cocoa 的内存管理规则,同时忽略retainCount. 确保您release或您拥有的每个对象,或者因为您保留它,或者因为您从以 、或开头autorelease的方法获得它。此外,您的发布/自动发布需要与您拥有的引用保持平衡。所以,如果你保留一个对象一次,你只能释放它一次。initnewcopymutableCopy

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

于 2012-02-20T05:53:15.913 回答
2

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

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

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

与其尝试使用-retainCount来查找泄漏,不如查看泄漏的对象。仪器可以帮助您做到这一点。确保您正在平衡这些对象的保留(当然还有分配、复制和新建)和释放。如果您过度保留或释放对象不足,则会导致泄漏。如果您无法控制的某些代码正在执行此操作,那么您无论如何也无能为力。

于 2012-02-20T05:56:23.540 回答