EXC_BAD_ACCESS при работе с основными данными - PullRequest
1 голос
/ 20 ноября 2011

Я новичок в Какао и пишу простое приложение, чтобы научиться работать с Core Data, но оно выходит из строя с EXC_BAD_ACCESS.Перепробовал несколько вещей и пока не нашел решения.Как я уже сказал, я не очень опытен в Какао.

Я следовал обычным учебным курсам по основным данным.

Это моя модель:

enter image description here

Я добавил эти две сущности как NSArrayController в моем Nib-файле и имею два 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 ]

2 голосов
/ 21 ноября 2011

Проверьте модель управляемого объекта. Убедитесь, что все имена сущностей и атрибутов написаны правильно. Также проверьте файлы классов объектов и убедитесь, что они содержат то, что вы ожидаете.

Возможно, отладчик не показывает правильную строку при сбое: я заметил, что у вас есть метод setKey:, но нет атрибута с именем key в вашей сущности Task. Попробуйте установить все атрибуты с точечной нотацией, например list.title = @"Inbox". (Обычно это проще для чтения и позволяет избежать подобных ошибок.)

Как и предполагалось, перед строкой вставки нового объекта установите точку останова и убедитесь, что контекст управляемого объекта не равен нулю.

Наконец, возможно, вам нужно разыграть свой предмет. insertNewObjectForEntityForName: возвращает объект типа NSManagedObject, но вы присваиваете его типу TaskList. Попробуйте добавить приведение, прежде чем использовать объект:

TaskList *list = (TaksList *) [NSEntityDescription
                  insertNewObjectForEntityForName:@"TaskList"
                  inManagedObjectContext: context];
0 голосов
/ 11 марта 2013

У меня была такая же проблема. Я решил это, как сказал Мостафа выше. Если вы создадите проект с включенными Core Data, он автоматически создаст файл для вас. Используйте этот .xcdatamodeld файл вместо пользовательского. Если он уже создан, просто удалите изначально созданный файл и переименуйте файл datamodel в имя первоначально созданного файла.

...