2014-01-21 3 views
3

Я настраиваю наследование.Objective-C: Использование методов наследования и вызова в дочернем классе

У меня есть родительский класс, который имеет метод, который вызывает блок. Как только блок возвращается, мне нужно, чтобы он вызывал переписанный метод в дочернем классе.

Когда я устанавливаю точки останова, после отказа блок вызывает метод в родительском классе. Что я делаю не так? Благодарю.

Родитель Класс

.h

@interface BaseClass : UITableViewController 
-(void)userModelUpdated 
-(void)updateModel 
@end 

.m

@implementation BaseClass 

-(void)userModelUpdated 
{} //this is left blank intentionally as a hook 


-(void)updateModel 
{ 
    //Here is s Block 
    [EndPoint updateUserModel:self.userModel successBlock:^{ 
    //Do Something 
    } errorBlock:^(NSError *error, NSArray *errorArray) {  
     [self userModelUpdated]; // I want to call the method in the child class 
     // but when I setup the break points, it calls the method in the parent class 
    } 
} 

Детский класс

.h

@interface childClass : BaseClass 

.m

@implementation ChildClass 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [self updateModel]; 
} 

-(void)userModelUpdated 
{ 
    // update UILabels Here  
} 
+1

У вас есть '@implementation ChildClass' дважды: в файле родительского класса .m и в файле .m-файла Child. - Это фактический код или некоторая ошибка копирования/вставки? –

+0

Извините. Фактический код действительно грязный, поэтому я упростил его. Я исправил реализацию. – user1107173

+0

Вы уверены, что объект, о котором идет речь, является экземпляром 'ChildClass'? Установили ли вы контрольную точку в 'updateModel' и проверили класс' self'? –

ответ

3

Если self является экземпляром ChildClass когда updateModel вызывается, то реализация этого ChildClass по -userModelUpdatedбудет выполнен.

Если это не так, то это потому, что у вас, вероятно, есть экземпляр BaseClass или у вас есть орфографическая ошибка.

Добавьте к этому все методы:

NSLog(@"%s", __PRETTY_FUNCTION__); 

Это будет войти именно то, что происходит на каждом этапе пути.

+0

Похоже, у меня есть экземпляр BaseClass. Почему у меня есть экземпляр BaseClass, когда ChildClass вызывает блок? – user1107173

+0

Вы проверили, является ли 'self' в' updateModel' экземпляром 'ChildClass'? – bbum

+0

Да.Я получил следующее: [BaseClass updateModel] _block_invoke43 – user1107173

0

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

-1

Блоки скомпилированы с объемом кода, в котором они находятся. В этом случае вы должны сделать свойство block и использовать set/get для установки в пределах дочернего класса. Тогда он будет работать так, как вы намереваетесь.

+0

А? Объект не меняет свой класс в зависимости от метода, в котором он используется. – gnasher729

Смежные вопросы