NSManagedObjectContext autorelease问题

时间:2012-12-29 18:12:05

标签: core-data nsmanagedobjectcontext nszombie

我一直在争取这个很长一段时间。我对Autorelease的理解是,当它不再需要它时它会释放它。

我在没有任何细节的情况下得到了一个邪恶的EXC_BAD_ACCESS。 它会崩溃:

 int main(int argc, char *argv[])
 {
     @autoreleasepool {
         return UIApplicationMain(argc, argv, nil, NSStringFromClass([Logix_AppDelegate      class]));
     }
 }

启用Zombies后,我发现我正在循环写入CoreData 这是我对NSManagedObjectContext的初始化

  NSManagedObjectContext *context = [[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext] autorelease];

这里有任何想法....有很多代码,所以我不想在这里粘贴大量的东西。

1 个答案:

答案 0 :(得分:2)

autorelease将一个对象添加到当前的自动释放池中。当前自动释放池被销毁时,该对象将收到release消息(并可能被释放)。

仅当您拥有该对象时才向对象发送autorelease才有意义。在您的情况下,managedObjectContext方法的名称中没有“new”,“alloc”或“copy”,因此您不拥有返回的对象,也不能在其上调用autorelease。 / p>

所以你应该用

替换那一行
NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

另请参阅“高级内存管理编程指南”中的Memory Management Policy

  

您拥有自己创建的任何对象
  您可以使用方法创建对象   其名称以“alloc”,“new”,“copy”或“mutableCopy”开头(for   例如,alloc,newObject或mutableCopy)。 ...

     

当您不再需要它时,您必须放弃您拥有的对象的所有权
  您通过发送release放弃对象的所有权   消息或autorelease消息。 ...

     

您不得放弃您不拥有的对象的所有权