Core data NSManagedObjectContext自动释放问题
我已经为此奋斗了很长时间了。我对自动释放的理解是,当它不再需要它时,它会释放它 我得到了一个没有任何细节的邪恶的EXC_BAD_访问。 它只会在以下情况下崩溃: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]));
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_访问权限。