2014-02-21 38 views
1

概要分析表明在每次迭代中存在一個對象泄漏,並且數組對象泄漏。概要分析顯示循環的每次迭代中存在泄漏

enter image description here

fetchedRecords是一個數組從executeFetchRequest:方法返回,我敢肯定,返回一個autoreleased數組。

-(NSArray *)getSavedVenues 
{ 
    NSMutableArray *venues = [[@[] mutableCopy] autorelease]; 
     for (Venues *venueManagedObject in fetchedRecords) 
     { 
      MSVenue *tmp = [[MSVenue alloc] init]; 
      [tmp setID:venueManagedObject.venueID]; 
      [tmp setName:venueManagedObject.venueName]; 

      [venues addObject:tmp]; 
      [tmp release]; 
      tmp = nil; 
     } 

     return [NSArray arrayWithArray:venues]; 
} 
+2

這個看起來很奇怪: 'NSMutableArray * venues = [[@ [] mutableCopy] autorelease];',爲什麼不創建NSMutable數組的實例而不是創建NSArray的可變副本? –

+1

@MykolaDenysyuk - 是的,我懷疑這是問題,但它有點愚蠢。 '[NSMutableArray數組]'更加清晰和高效地完成了同樣的事情。 –

+0

你的問題不清楚。我們是否看到上面'for'循環的迭代,或者這個方法之外的某些循環的迭代?上面的代碼會在每次迭代時「積累」一個MSVenue對象,因爲這就是你在數組中放置的內容。這很正常。 –

回答

-2

嘗試改變:

[tmp setName:venueManagedObject.venueName];

[tmp setName:[NSString stringWithString:venueManagedObject.venueName]];

取決於你如何宣佈MSVenue Name屬性,你可以創建一個強引用另一個對象的venueName,阻止該對象被釋放。這是一個循環引用 - fetchedRecords將不會被自動釋放,直到所有引用它的對象都被釋放,並且在fetchedRecords被釋放之前它們將不會被釋放。

與venueId相同,除非它是標量類型(例如NSInteger)。

+0

從來沒有真正的理由使用stringWithString,除非parm是一個可變字符串。 –

+0

你對「屬於另一個對象」有一種誤解。 –