2010-10-29 34 views
0

我正在分析我的應用程序泄漏,我觀察到一些核心數據實體泄漏,NSManagedObject如何泄漏?我認爲這是由操作系統管理的?核心數據中是否存在泄漏?泄漏說行導致泄漏iOS核心數據如何泄漏?

NSMutableArray *e=[NSMutableArray arrayWithArray:[[user videos] allObjects]]; 
    //the line above^is pointed to by leaks as generating a leak 
for(VideoEntity * v in e) 
{ 
    UploadThread *ut= [[UploadThread alloc] init]; 
    [ut setVideoEntity:v]; 
    [threads addObject:ut]; 
    [ut release]; 
} 

當用戶被包含VideoEntity爲一對多的關係,我分配VideoEntitys一些線程上運行一個管理對象...泄漏說VideoEntity是泄漏。

有沒有人有任何輸入?

回答

1

UploadThread可能會保留它並永不釋放它。是的,NSManagedObjects可能會泄漏。他們只是對象。它們是系統其餘部分使用的相同內存管理的一部分。

+0

這是一個相當多點,我雖然沒有假設保留或釋放託管對象,但UploadThread的setter被聲明爲retain,這應該不是!即使對象仍然由系統管理,調用保留實際上是否有泄漏(內存未被重新分配)? – Daniel 2010-10-29 22:06:49

+1

不,你絕對應該保留/釋放它們。它們是正常的obj-c對象,它們只是通過上下文完成一些額外的管理。如果你不保留/釋放這些物體,那麼它們可能停留在周圍,或者它們可能會從你下面消失,這取決於環境是否決定保持它們。在思考內存管理時,你應該忽略上下文,只是像對待任何其他模型對象一樣對待它們。 – 2010-10-29 22:54:52

1

具有關係的被管理對象具有隱式保留週期(即關係的兩側保留其對象)。一旦你在關係中失敗了,你就創建了這個保留週期。要打破它,您需要撥打-[ManagedObjectContext refreshObject:mergeChanges:]來重新斷開對象並打破保留週期。

欲瞭解更多信息,請參閱Core Data Programing Guide的內存管理部分。另外,就像一個說明,如果你通過線程發送託管對象的實例,你不應該這樣做。你應該使用對象id代替(這些是線程安全的)。