Проблема с CoreData: - [NSManagedObject setValue:]: нераспознанный селектор отправлен на экземпляр - PullRequest
18 голосов
/ 28 декабря 2010

Я только вчера начал с CoreData, и я схожу с ума :( Я создал проект, который использует CoreData (поставил галочку в поле -use CoreData). Создал сущности, а затем создал классы NSManagedObject для всех сущностей (япредположим, что они создают методы «setter» и «getter» для сущностей).

Теперь я # импортировал все эти классы в свой AppDeletegate и написал это в моем методе applicationDidFinishLaunching:

(Подпискиявляется одним из объектов в приложении)

NSManagedObjectContext *context = [self managedObjectContext];
 Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
 [sbs setTitle:@"OK"];
 [sbs setType:@"Tag"];
 [sbs setCode:@"cars"];

 NSError *error = nil;
 if (![context save:&error]) {
  NSLog(@"Couldn't create the subscription");
 }

Когда я запускаю это, я получаю эту ошибку

[NSManagedObject setTitle:]: нераспознанный селектор, отправленный экземпляру 0x6160550

Понятия не имею, почему это происходит. Пожалуйста, помогите !!! Спасибо всем заранее!

Добавление заголовка подписок Subscription.h

@ interface Подписки: NSManagedObject {}@property (nonatomic, retain) NSString * Тип;@property (nonatomic, retain) NSDecimalNumber * Read;@property (nonatomic, retain) NSString * Заголовок;@property (nonatomic, retain) NSString * Код;@property (nonatomic, retain) NSDecimalNumber * New;@ end

Я ничего не менял.Это так же, как Xcode создал его.

Ответы [ 8 ]

32 голосов
/ 16 января 2011

Просто чтобы напомнить, что не используйте заглавные буквы, это может повлиять на работу геттеров и сеттеров.

Если вы сгенерировали подклассы NSManagedObject из модели данных, все должно работать нормально, хотя это @dynamic, сеттеры реализованы coredata, и, поскольку они уже реализованы, вы не должны изменять его для синтеза. По крайней мере для меня coredata возвращает пустой объект после того, как я изменил @dynamic на @synthesize.

И не забудьте указать имя класса в модели данных:

enter image description here

12 голосов
/ 12 апреля 2012

Я получил это, и сделал Очистку проекта, и это исправило это.

4 голосов
/ 07 февраля 2013

Я добавил attirbute к сущности Core Data, и вместо повторного создания NSManagedObjectSubclass, Я попытался придумать и вручную добавить @property и @dynamic к существующему подклассу.

Это не сработало , поэтому я пошел и заново создал подкласс с помощью XCode, то есть когда я начал получать эту ошибку («нераспознанный селектор отправлен в экземпляр» при установке значения для атрибута ).

Таким образом, я создал новую версию Базовой модели данных через XCode , затем очистил, удалил производные данные и затем заново создал подкласс NSManagedObject . Это сработало.

Вероятно, он создавал новую модель данных и новый подкласс, основанный на этом, поэтому мне, вероятно, не нужно было чистить или удалять производные данные ... но это тоже не повредило!

3 голосов
/ 28 декабря 2010

Две возможные проблемы

У вас есть соответствующий блок @dynamic в файле .m для этих свойств и

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

@property (nonatomic, retain) NSString * type; в .h

и

@dynamic type; в .m

становится чем-токак

-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
} 

-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}

на заднем плане.Хотя вы не можете видеть этот код когда-либо.

Соглашения по делу зависят от вас, но Camel Caps формально нормальны с Какао.Но это очень похоже на объект, такой как Big Furry Cat становится bigFurryCat.Следуйте стилю в примерах Apple.

РЕДАКТИРОВАТЬ - измените @synthesize на @dynamic

2 голосов
/ 16 июня 2012

Я обнаружил, что, имея отношения к сущностям, я должен был убедиться, что некоторые из моих отношений будут со многими, я сделал снимок экрана, чтобы вы могли понять, что я имею в виду, отношение ко многим обозначено стрелкой с двойным концом

enter image description here

0 голосов
/ 07 июня 2016

выполните следующие шаги

1) создали новую версию модели базовых данных через XCode.

2) Исправьте отношения (добавлены новые отношения между ними.)

Создание отношений управляемых объектов

3) пересоздание подкласса NSManagedObject

0 голосов
/ 14 июля 2012

У меня была такая же проблема, и я нашел не очень элегантное решение.Кажется, что

[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];

создает старую версию myEntity, которая не имеет атрибутов самой последней версии.Поэтому я изменил имя myEntity в старой версии модели на myEntityOld и больше не получал ошибку.

Я подозреваю, что есть элегантный способ сделать то же самое вXCode, установив свойство NSManagedObject или NSEntityDescription.

0 голосов
/ 28 декабря 2010

Похоже, атрибут заголовка не может быть установлен в строку. Вы это проверяли?

Обычно нераспознанный селектор, отправляемый экземпляру, является причиной ошибки времени выполнения, посылая сообщение объекту, который объект не знает, как обрабатывать.

Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
sbs.Title = @"OK";

Надеюсь, что помощь

Я сделал простой проект здесь.

...