0

我有这个内存泄漏,在过去一周左右一直非常固执。我在一个名为“ArchiveManager”的类中使用了一个类方法,它将为我解开一个特定的.dat文件,并返回一个包含它的内容的数组。这里是方法:返回对象时发生内存泄漏

+(NSMutableArray *)unarchiveCustomObject 
{ 
    NSMutableArray *array = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithFile:/* Archive Path */]]; 
    return array; 
} 

我知道我现在没有它的所有权,我将它归还。

CustomObject *myObject = [[ArchiveManager unarchiveCustomObject] objectAtIndex:0]; 

然后,后来当我解除封存中使用视图控制器(我甚至不创建它的阵列,我也不做它的指针,我只是引用它得到的东西通过unarchiveCustomIbject(objectAtIndex)返回的数组这是仪器被调用内存泄漏,但我不明白这是如何泄露任何想法提前

感谢

编辑:!?。CustomObject的initWithCoder补充:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) 
    { 
     self.string1 = [aDecoder decodeObjectForKey:kString1]; 
     self.string2 = [aDecoder decodeObjectForKey:kString2]; 
     self.string3 = [aDecoder decodeObjectForKey:kString3]; 
     UIImage *picture = [[UIImage alloc] initWithData:[aDecoder decodeObjectForKey:kPicture]]; 
     self.picture = picture; 
     self.array = [aDecoder decodeObjectForKey:kArray]; 
     [picture release]; 
    } 
    return self; 
} 

编辑2:我做了一个CustomObject的跟踪,并且我意识到在我的应用程序中,另一个对象(OtherObject)具有它的initWithCoder方法分配一个CustomObject的参数,使其保留CustomObject。它看起来像这样:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super init]) 
    { 
      self.customObject = [aDecoder decodeObjectForKey:kCustomObjectKey]; 
    } 
} 
+0

您是在模拟器还是在设备上测试?如果您正在使用模拟器,请尝试使用该设备;模拟器经常给内存分析带来错误的结果。 – deanWombourne 2010-03-12 17:58:40

+0

我正在使用该设备。 – skylerl 2010-03-12 18:17:22

+1

你可以发布CustomObject的initWithCoder:方法实现吗? – 2010-03-12 20:52:57

回答

0

仪器告诉你泄漏的是什么?它可能是你的CustomObject吗?

(撇开小 - 是有一个原因你的方法返回一个NSMutableArray,而不是一个NSArray?)

+0

它告诉我有大量的对象在泄漏,包括NSMutableArrays,CustomObject等等。它们都是从同一个方法泄漏出来的,而且当我进一步查看堆栈跟踪时,它确实发现它泄漏在CustomObject的initWithCoder方法中,但是我已经检查过,并且没有办法导致这种情况。- – skylerl 2010-03-12 18:37:54

+0

如果可变数组泄漏,那么无论嵌套在其中的对象是否也会泄漏,因为集合保留了它们的对象。所以我会专注于弄清楚哪些阵列在泄漏,为什么是第一个。 – jlehr 2010-03-12 18:47:15

+0

但我并没有声称拥有它们中的任何一个。我从来不会在它们上调用alloc/init/retain/copy/new等。如果我使用alloc/init对数组进行归档并将其解除归档,它是否保留与归档时相同的保留计数? – skylerl 2010-03-12 18:54:40

1

你怎么宣布你的属性?分配,保留,复制?你确定在你的dealloc方法中,如果有必要的话你释放它们吗?

+0

他们都准备保留,所有这些都在dealloc中发布。 – skylerl 2010-03-12 21:17:24

+0

+1乐器告诉你哪个对象被创建的*被泄露,而不是你失去了最后一次引用的地方。如果你忘记用'dealloc'方法释放你的对象,那么你会泄漏一个对象,但它会告诉你在哪里创建对象。 – 2010-03-12 21:17:52

+0

我剔除/释放了所有这些,但是,它仍然造成泄漏。 – skylerl 2010-03-14 00:07:48