iOS核心数据如何泄漏?

iOS核心数据如何泄漏?,ios,iphone,core-data,memory,memory-management,Ios,Iphone,Core Data,Memory,Memory Management,我在分析我的应用程序时发现有漏洞,我观察到一些核心数据实体正在泄漏,NSManagedObject怎么会泄漏?我以为它是由操作系统管理的?核心数据是否存在已知泄漏?泄漏导致泄漏的管线是 NSMutableArray *e=[NSMutableArray arrayWithArray:[[user videos] allObjects]]; //the line above ^ is pointed to by leaks as generating a leak for(VideoEn

我在分析我的应用程序时发现有漏洞,我观察到一些核心数据实体正在泄漏,NSManagedObject怎么会泄漏?我以为它是由操作系统管理的?核心数据是否存在已知泄漏?泄漏导致泄漏的管线是

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作为一个对多关系,我将VideoEntity分配给一些线程进行操作……泄漏表示VideoEntity正在泄漏


有人有任何输入吗?

UploadThread可能会保留它而从不释放它。是的,NSManagedObjects可能会泄漏。它们只是物体。它们是系统其余部分使用的相同内存管理的一部分。

具有关系的托管对象具有隐式保留周期(即,关系的两侧保留其对象)。一旦你在一段关系中犯了错误,你就创建了这个保留周期。要中断它,您需要调用
-[ManagedObjectContext refreshObject:mergeChanges::
来重新中断对象并中断保留周期

有关详细信息,请参阅的“内存管理”部分


另外,请注意,如果要跨线程发送托管对象的实例,则不应该这样做。您应该改为使用对象id(这些是线程安全的)。

这是一个有趣的问题,我认为不应该保留或释放托管对象,但UploadThread的setter声明为retain,这可能不应该!即使对象仍然由系统管理,调用retain是否确实存在泄漏(内存没有被重新分配)?不,您肯定应该保留/释放它们。它们是普通的obj-c对象,它们只是由上下文进行一些额外的管理。如果不保留/释放对象,则它们可能会留在周围,也可能会从下方消失,这取决于上下文是否决定保留它们。在考虑对它们进行内存管理时,应该忽略上下文,而只是像对待任何其他模型对象一样对待它们。