我是Cocoa的新手,我正在编写一个简单的应用程序来学习使用Core Data,但它与EXC_BAD_ACCESS
崩溃了。尝试了几件事,但还没有找到解决方案。正如我所说,我对Cocoa的经验不足。
我遵循了通常的核心数据教程。
这是我的模特:
我已在我的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;
}
答案 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文件重命名为最初创建的文件名。