为什么发布我的Core Data上下文/实体会让我的应用程序崩溃?

时间:2011-03-16 18:41:14

标签: iphone objective-c cocoa-touch core-data memory-management

我有一个简单的CoreData应用程序,它允许您将项目添加到列表中,显示在表格视图中。当用户键入新项时,将调用以下方法:

- (void)addNewItem:(NSString *)item
{
    // Create a new instance of the entity managed by the fetched results controller.
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
    NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
    Item *newItem = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

    [newItem setName:item];

    // Save the context.
    NSError *error = nil;
    if (![context save:&error])
    {
        //error handling code
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    [context release];
    [entity release];
    [newItem release];

该应用程序始终允许您将一个项目添加到列表中,但如果您尝试添加一个项目,则会崩溃。如果我删除“[newItem release];”,该应用程序将允许您添加4个列表项,然后当您尝试输入第五个时突然崩溃。

只有删除方法末尾的所有三个发布语句后,该应用才能正常运行。任何人都可以解释原因吗?

2 个答案:

答案 0 :(得分:6)

对象都是自动释放的(因为你永远不会alloc init任何东西),所以你不应该自己释放它们。当你的应用程序崩溃时,我无法预测,但它最终会崩溃。

答案 1 :(得分:3)

只是为了澄清@ BoltClock的答案。它不仅仅是allocinit,还有new...copy...等。

您应该阅读Memory Management Guide,尤其是Memory Management Rules