Цель C - загрузка UIView из пера? - PullRequest
2 голосов
/ 02 августа 2011

У меня есть базовый класс, который инициализируется из файла nib.Как я могу наследовать от этого class.Каждый раз, когда я запускаю subclass, он создает объект базового класса вместо фактического class. Я пытаюсь создать

Базовый класс

@implementation BaseClass
- (id)init{
   self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" 
                                          owner:self 
                                        options:nil] lastObject] retain];
   if (self){
   }

   return self;
}

@end

Класс

@implementation MyClass //Inheriting from BaseClass
- (void)init {
   self = [super init];

   if (self) {
   }

   return self;
}

- (void)methodSpecificToThisClass {
   //do something
}
@end

Использование

// It crashes when I call 'methodSpecificToThisClass' 
// because the type that has been created is a type 
// of my BaseClass instead of MyClass
MyClass *myClass = [[MyClass alloc] init];
[myClass methodSpecificToThisClass];

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

Изменить self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" owner:self options:nil] lastObject] retain]; на self = [[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] lastObject] retain];

Это, конечно, при условии, что у вас есть отдельные кончики для каждого типа представления.

2 голосов
/ 02 августа 2011

Поскольку вы всегда загружаете объекты из одного и того же файла пера, вы всегда получаете одни и те же объекты. Если объект в кончике имеет тип BaseClass, то при загрузке кончика вы получите объект типа BaseClass. Неважно, что вы выделяете MyClass - то, что вы выделяете, не вступает в игру, потому что вы присваиваете self загруженному объекту. (На самом деле, поскольку вы никогда не освобождаете выделенную память до переназначения self, вы теряете выделенную память.) Также не важно, что вы объявили указатель как MyClass* - это позволяет вам вызывать -methodSpecificToThisClass без получения жалобы от компилятора, но это не меняет того факта, что фактический объект является экземпляром BaseClass. Когда вы вызываете этот метод, вы получаете ошибку «невыполненный селектор», когда среда выполнения пытается разрешить селектор и обнаруживает, что он не существует для этого объекта.

Если вы хотите загрузить MyClass из пера, вам нужно будет использовать перо, содержащее MyClass вместо BaseClass.

...