Почему я должен установить родительский объект при создании подклассов и абстрактном объекте? - PullRequest
4 голосов
/ 11 июля 2011

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

В XCode 4.0.2 это свойство родительского объекта, на которое я ссылаюсь:

enter image description here

Чего я не понимаю, так это того, что я думал, что родительский объект предназначен для родительско-дочерних отношений между сущностями, а объектные отношения просто фиксируются определениями класса.

Пример

Объекты A, B и C:

  • A является абстрактной сущностью типа A с атрибутами:
    • y: строка
    • z: строка
  • B - это объект типа A без атрибутов
  • C - это объект типа A без атрибутов

Классы A, B и C:

@interface A : NSManagedObject {
}
@property (nonatomic, retain) NSString * y;
@property (nonatomic, retain) NSString * z;

@interface B : A {
}
@interface C : A {
}

Проблема

Если я не установил родительский объект для объектов B и C в качестве объекта A, то при попытке:

NSEntityDescription *be = [[mom entitiesByName] objectForKey:@"B"];
B *b = [[NSManagedObject alloc] initWithEntity:be
                insertIntoManagedObjectContext:moc];

b.y = @"test"; // <<-- This line causes the following error:

Я получаю:

-[NSManagedObject setY:]: unrecognized selector sent to instance

Если я установил родительский объект, он, кажется, работает, за исключением того, что объект сохраняется в хранилище, кажется, A вместо B.

1 Ответ

3 голосов
/ 11 июля 2011

Помните ли вы установить класс для объекта B в класс B? Если да, вы должны взглянуть на тип указателя, который назначен на b ... это на самом деле B *? Похоже, что это, вероятно, NSManagedObject * в зависимости от получаемой ошибки и в соответствии с документами для -initWithEntity:insertIntoManagedObjectContext: ...

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

... Я думаю, вы должны получить B *, если ваша модель настроена правильно.

...