1

我已经为此奋斗了很长时间。我对 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];

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

4

1 回答 1

2

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

仅当您拥有该对象时,发送autorelease到该对象才有意义。在您的情况下,该方法的名称中没有“new”、“alloc”或“copy”,因此您不拥有返回的对象,也不能调用它。managedObjectContextautorelease

所以你应该用

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

另请参阅“高级内存管理编程指南”中的内存管理策略:

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

When you no longer need it, you must relinquish ownership of an object you own
You relinquish ownership of an object by sending it a release message or an autorelease message. ...

You must not relinquish ownership of an object you do not own

于 2012-12-29T18:39:52.897 回答