使用Core Data时EXC_BAD_ACCESS

时间:2011-11-19 20:02:45

标签: macos cocoa core-data exc-bad-access

我是Cocoa的新手,我正在编写一个简单的应用程序来学习使用Core Data,但它与EXC_BAD_ACCESS崩溃了。尝试了几件事,但还没有找到解决方案。正如我所说,我对Cocoa的经验不足。

我遵循了通常的核心数据教程。

这是我的模特:

enter image description here

我已在我的Nib文件中将这两个实体添加为NSArrayController,并且有两个NSTableView,其中包含对实体对象的值绑定。

这是代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSManagedObjectContext *context = [self managedObjectContext];
    TaskList *list = [NSEntityDescription
                      insertNewObjectForEntityForName:@"TaskList"
                      inManagedObjectContext: context]; // EXC_BAD_ACCESS happens here
    [list setTitle:@"Inbox"];
    Task *task = [NSEntityDescription
                  insertNewObjectForEntityForName:@"Task"
                  inManagedObjectContext: context];
    [task setKey:@"Remember the milk"];
    [task setList:list];
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Error: %@", [error localizedDescription]);
    }
}

就是这样!这就是我的全部计划。我正在使用Xcode 4.2,开发Mac应用程序,并启用ARC。

更新: jrturton要求我加入[self managedObjectContext]的实施。我没有写这段代码,但这是我在AppDelegate.h中找到的:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

这是来自AppDelegate.m

@synthesize managedObjectContext = __managedObjectContext;
...
/**
    Returns the managed object context for the application (which is already
    bound to the persistent store coordinator for the application.) 
 */
- (NSManagedObjectContext *)managedObjectContext {
    if (__managedObjectContext) {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
        [dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
        NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        [[NSApplication sharedApplication] presentError:error];
        return nil;
    }
    __managedObjectContext = [[NSManagedObjectContext alloc] init];
    [__managedObjectContext setPersistentStoreCoordinator:coordinator];

    return __managedObjectContext;
}

2 个答案:

答案 0 :(得分:2)

检查您的托管对象模型。确保所有实体和属性名称拼写正确。还要检查对象类文件,确保它们包含您期望的内容。

也许调试器在崩溃时没有向您显示正确的行:我注意到,您有一个方法setKey:,但在您的任务实体中没有名为key的属性。尝试使用点表示法设置所有属性,例如list.title = @"Inbox"。 (这通常更容易阅读并避免类似的错误。)

根据建议,在插入新实体的行之前,设置断点并确保托管对象上下文不为空。

最后,也许你必须施放你的物体。 insertNewObjectForEntityForName:返回NSManagedObject类型的对象,但您将其分配给类型TaskList。在使用对象之前尝试添加强制转换:

TaskList *list = (TaksList *) [NSEntityDescription
                  insertNewObjectForEntityForName:@"TaskList"
                  inManagedObjectContext: context];

答案 1 :(得分:0)

我有同样的问题。我解决了它就像上面的Mostafa所说的那样。如果您创建启用了Core Data的项目,它将自动为您创建一个文件。使用此.xcdatamodeld文件而不是自定义文件。如果您已经创建了一个,只需删除最初创建的文件并将datamodel文件重命名为最初创建的文件名。