2010-10-29 96 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代替(这些是线程安全的)。