我一直在争取这个很长一段时间。我对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];
这里有任何想法....有很多代码,所以我不想在这里粘贴大量的东西。
答案 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
消息。 ...您不得放弃您不拥有的对象的所有权