2013-06-27 2 views
4

У меня есть две основные модели данных с свойствами int64_t. Один из них отлично работает, а другой выбрасывает EXC_BAD_ACCESS, когда я пытаюсь назначить ненулевое значение целочисленному полю. Я прочитал ответы, которые говорят, чтобы воссоздать дочерний класс NSManagedObject, и я сделал это без успеха. Разбитый класс выглядит следующим образом:Основные данные EXC_BAD_ACCESS для ненулевых целых значений

@interface NoteObject : NSManagedObject 

@property (nonatomic) int64_t remoteID; 
@property (nonatomic) int64_t remoteArticleID; 

@property (strong, nonatomic) ArticleObject *article; 

@property (strong, nonatomic) NSString *status; 
@property (strong, nonatomic) NSString *token; 

@property (strong, nonatomic) NSString *title; 
@property (strong, nonatomic) NSString *noteContent; 

@property (strong, nonatomic) NSDate *pubDate; 
@property (strong, nonatomic) NSDate *modDate; 

@end 

@implementation NoteObject 

@dynamic remoteID; 
@dynamic remoteArticleID; 

@dynamic article; 

@dynamic status; 
@dynamic token; 

@dynamic title; 
@dynamic noteContent; 

@dynamic pubDate; 
@dynamic modDate; 

@end 

Нарушитель линия в этом блоке:

_noteObject = [NSEntityDescription insertNewObjectForEntityForName:@"Note" inManagedObjectContext:self.managedObjectContext]; 

_noteObject.remoteArticleID = 0; // this works 
_noteObject.remoteArticleID = 1; // this crashes 

Что действительно меня в тупике, что в другой модели у меня есть один и то же поле с теми же типами, и они будет принимать ненулевые значения без каких-либо проблем:

bookmarkObject = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext]; 

bookmarkObject.remoteArticleID = 0; // this works 
bookmarkObject.remoteArticleID = 1; // this works, too 

есть ли что-нибудь в моем файле .xcdatamodeld, что может быть причиной этого?

EDIT

Мои модели данных выглядит следующим образом:

NoteObject Data Model BookmarkObject Data Model

+0

Существуют ли какие-либо различия в конфигурации поля remoteArticleID для вашего NoteObject и вашей закладки в файле .xcdatamodeld? – danielM

+0

Вы сами пишете файлы подкласса управляемого объекта или генерируете их Xcode? –

+0

Вы должны подумать об использовании 'mogenerator' для создания классов управляемых объектов. – Wain

ответ

2

Ну, в случае, если кто-то еще с этим вопросом, я никогда не находил удовлетворительного ответа, почему один объект работал, а другой - нет. Моим обходным путем было рефакторинг свойств для использования оберток NSNumber вместо примитивных значений int64_t.

@property (strong, nonatomic) NSNumber *remoteID; 
@property (strong, nonatomic) NSNumber *remoteArticleID; 

Конечно, это означает, что бокс/распаковка целых значений.

_noteObject.remoteArticleID = [NSNumber numberWithInt:1]; 

int intVar = [_noteObject.remoteArticleID intValue]; 
+0

Странно, но эта вещь работает для меня. Должен быть какой-то способ прямого отношения к примитивному типу данных. – technerd

5

У меня была точно такая же проблема.

Похоже, что xcode (или, возможно, компилятор или, возможно, два между ними) иногда путают, когда вы вручную редактируете свойства в NSManagedObject - он заканчивает обработку наших целых чисел в качестве указателей и пытается напрямую обращаться к памяти - следовательно, EXC_BAD_ACCESS.

В любом случае, поскольку этот вопрос объясняет: SO Question, решение состоит в том, чтобы удалить старый класс (очевидно, скопируйте какой-либо пользовательский код, чтобы снова вставить его позже), а затем получите xcode для его регенерации (выберите объект в модели данных и выберите «Редактор/Создать подкласс NSManagedObject ...»). В появившемся диалоге убедитесь, что «Использовать скалярные свойства для примитивных типов данных» отмечен галочкой.

Возможно, вам придется вручную отредактировать полученный класс, чтобы превратить некоторые не скалярные свойства обратно в объекты (у меня был объект даты, который он превратил в нечто иное, чем NSDate - я забыл, что именно, но он принял вручную сделанное редактирование назад к NSDate).

Это сработало для меня. Надеюсь, это сработает для вас.

Али

+0

+1 Добавлен дополнительный контекст к существующему ответу. (вы могли бы отметить этот вопрос также как дубликат) –

0

В файле модели, убедитесь, что свойство «Класс» на лица устанавливается в соответствующий класс, а не по умолчанию NSManagedObject.

Entity settings

Если оставить его в качестве NSManagedObject, Core Data будет создавать сам свойство на настраиваемый NSManagedObject подкласса он генерирует себя, вместо того чтобы использовать свой собственный подкласс. Большинство получателей и сеттеров, похоже, будут работать, но у вас могут возникнуть проблемы с примитивными свойствами, не связанными с коробкой, и с пользовательскими геттерами и сеттерами.