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