Core data NSManagedObjectContext自动释放问题

Core data NSManagedObjectContext自动释放问题,core-data,nsmanagedobjectcontext,nszombie,Core Data,Nsmanagedobjectcontext,Nszombie,我已经为此奋斗了很长时间了。我对自动释放的理解是,当它不再需要它时,它会释放它 我得到了一个没有任何细节的邪恶的EXC_BAD_访问。 它只会在以下情况下崩溃: int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([Logix_AppDelegate class]));

我已经为此奋斗了很长时间了。我对自动释放的理解是,当它不再需要它时,它会释放它

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

 int main(int argc, char *argv[])
 {
     @autoreleasepool {
         return UIApplicationMain(argc, argv, nil, NSStringFromClass([Logix_AppDelegate      class]));
     }
 }
启用僵尸后,我发现我在循环中写入CoreData 以下是我对NSManagedObjectContext的初始化

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

有什么想法吗。。。。有很多代码,所以我不想在这里粘贴大量的内容。

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

只有当您拥有某个对象时,才可以向该对象发送
autorelease
。在您的情况下,
managedObjectContext
方法的名称中没有“new”、“alloc”或“copy”,因此您不拥有返回的对象,并且不能对其调用
autorelease

所以你应该用

NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
另请参见“高级内存管理编程指南”:

您拥有您创建的任何对象
使用方法创建对象 其名称以“alloc”、“new”、“copy”或“mutableCopy”(用于 例如,alloc、newObject或mutableCopy)

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

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


我想我可能是从网上得到了coredata的那段代码。。。我猜这不是获取代码的最佳地方。我是按照你说的方式做的,但它又造成了一些错误。我得挖得更深一些。这是一个良好的开端。这是最好的解释自动释放任何人都提供@逻辑学家:您是否可以选择将项目迁移到ARC(自动引用计数)?ARC编译器非常聪明,可以使大多数保留/释放问题消失。(但知道“幕后”发生了什么还是有帮助的。)我认真考虑了一下,但是手工操作太接近完成了,我不想冒险去修复很多错误。你做过弧线转换吗?在完成转换后需要做多少工作。现在可以了。谢谢我想我的内存管理有点问题。我已经摆脱了上下文,这导致它给了我EXC_BAD_访问权限。