Базовые данные EXC_BAD_ACCESS при назначении переменной - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь сохранить значение для основного объекта данных следующим образом:

CoreDataStack *coreDataStack = [CoreDataStack defaultStack];
NSError *error = nil;

for (NSDictionary *dic in controlTypeResponse.DataDic) {
    ControlType *controlType = [NSEntityDescription insertNewObjectForEntityForName:@"ControlType" inManagedObjectContext:coreDataStack.managedObjectContext];

    controlType.controlTypeID = [[dic valueForKey:@"ControlTypeID"] integerValue];
    controlType.controlTypeName = [dic valueForKey:@"ControlTypeName"];
}

[coreDataStack.managedObjectContext save:&error];

Но при назначении controlTypeID приложение вылетает с ошибкой EXC_BAD_ACCESS. Интересно, что поле адреса памяти в деталях ошибки (code=1, address=0x2) изменяется в зависимости от значения [[dic valueForKey:@"ControlTypeID"] integerValue] (например, в данном случае это значение равно 2).

Есть идеи о том, почему это происходит? Я искал Core Data Documentation и проблемы с параллелизмом в SO, но моя проблема, похоже, не связана с этими проблемами.

1 Ответ

0 голосов
/ 24 февраля 2020

Совершенно очевидно, что вы создаете здесь несоответствие типов ...

Итак, в вашей модели базовых данных для Class Codegen установлено значение "Определение класса" или "Вручную / Нет"?

Если вы установили его на «Ручной / Нет», вы сможете проверить свой NSManagedObject файл заголовка подкласса для вашей сущности ControlType.

Возможно объявление для атрибута выглядит примерно так?

@property (nonatomic, retain) NSNumber * controlTypeID;

Если нет, для какого типа он установлен?

Если вы установили его в "Определение класса", вы не сможете проверить подкласс NSManagedObject для вашей сущности ControlType, однако я понимаю, что для базовых данных по умолчанию все целые числа (целое число 16, 32, 64) имеют тип NSNumber.

Так или иначе, для вашего вызова нужно установить controlType.controlTypeID для работы вам необходимо преобразовать числовое значение вашего атрибута controlTypeID в тип, который Базовые данные могут преобразовать в вашу модель (и, следовательно, сохранить в постоянном хранилище).

Если мой думаю, это правильно, это может работать ...

controlType.controlTypeID = [NSNumber numberWithInt:[dic valueForKey:@"ControlTypeID"]]

Если это не так, может быть, я неправильно понял ... дайте мне знать.

...