Cocoa-Touch, NSManagedObject: Исключение при установке свойства - PullRequest
2 голосов
/ 12 октября 2009

У меня есть подкласс NSManagedObject, созданный интерфейсом модели XCode.
Этот класс имеет несколько членов NSString и NSNumber, а также член NSDate.

Когда я пытаюсь установить элемент NSDate, я получаю следующее исключение:
2009-10-12 21:53:32.228 xxx[2435:20b] Failed to call designated initializer on NSManagedObject class 'Item'<br> 2009-10-12 21:53:32.228 xxx[2435:20b] *** -[Item setDate:]: unrecognized selector sent to instance 0x3f7ed30<br> 2009-10-12 21:53:32.229 xxx[2435:20b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Item setDate:]: unrecognized selector sent to instance 0x3f7ed30'

Параметр даты аналогичен другим, за исключением того, что вместо

@property (nonatomic, retain) NS{String,Number}* propname;  

это

@property (nonatomic, retain) NSDate *date;

Кстати, экземпляр Item, который я назначаю, является обычным [[Item alloc] init], без связанного контекста или чего-либо еще.

Сначала я подумал, что мой NSDate * неисправен, затем я попытался назначить его [дата NSDate], и ​​даже ноль. Он все еще падает.

Есть идеи?

1 Ответ

9 голосов
/ 12 октября 2009

Вы не можете создать экземпляр подкласса NSManagedObject без ассоциированного NSManagedObjectContext (ну, вы можете , как вы показали, но результаты почти наверняка не будут такими, как вы хотите).

Первая строка журнала намекает на это:

2009-10-12 21:53:32.228 xxx[2435:20b] Failed to call designated initializer on NSManagedObject class 'Item'

Все классы Objective-C имеют (по соглашению) обозначенный инициализатор , который является методом инициализатора, который должен быть вызван , либо явно, либо через другой удобный инициализатор. В случае NSManagedObject это -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:]. Неспособность вызвать указанный инициализатор приводит к неопределенному и, вероятно, некорректному поведению, поскольку не гарантируется, что экземпляр будет правильно инициализирован. Я полагаю, что инициализатор NSManagedObject устанавливает механизм для поддержки доступа к свойствам @synthesize d для атрибутов сущности. Без этого механизма экземпляр может не думать, что он может отвечать на вызовы @synthesize ', а ваш вызов setData: вызовет ошибку селектора не найдена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...