2012-04-24 1 views
3

Почему наследование должно начинаться с NSObject, а затем использовать наследование в другом классе?Почему наследование должно быть «подклассом» NSObject?

Удивите, почему у меня есть подкласс «FatherClass» из UIViewController. Итак, я хочу создать наследование FatherClass (ChildClass: FatherClass).

Я не могу этого сделать, я получаю журнал ошибок. Все примеры, которые я искал здесь, и Google начинаются с NSObject как отец.

Так что мой вопрос должен быть таким? Или я где-то ошибаюсь.

Вот журнал регистрации ошибок

#0 0x33d6c6f8 in CFStringGetCharacters() 
CoreFoundation`CFStringGetCharacters: 
0x33d6c6f8: push.w {r8, r10} 

Благодаря

EDIT здесь с кодом

FatherClass.h

@class ChildClass; 
@interface FatherClass : UIViewController <UITabBarControllerDelegate, UINavigationBarDelegate, UIPopoverControllerDelegate, MKMapViewDelegate, MKAnnotation> 
{ 
    //Some variables 
} 
@property (nonatomic, strong) ChildClass *sidebar_table_controller; 

-(void) show_modal: (id) sender; // Thats the Method i want to call 
@end 

FatherClass.m

#import "FatherClass.h" 
#import "ChildClass.h" 
@interface FatherClass() 

@end 

@implementation FatherClass 

@synthesize sidebar_table_controller; 

// All inits here... DidiLoad, DidUnload, etc.. 

-(void) show_modal: (id) sender // Thats the Method!!! 
{ 

     // All initiate ChildClass an then.. present modal 

     [self presentModalViewController:self.sidebar_table_controller animated:YES]; 

     NSLog(@"Clicked ?...%@", sender); 
} 
@end 

Теперь ребенок

ChildClass.h

@interface ChildClass : FatherClass <UINavigationControllerDelegate, UITableViewDataSource, UITableViewDelegate> 
@end 

ChildClass.m

#import "ChildClass.h" 

@interface ChildClass() 

@end 

@implementation ChildClass 
// All inits here... DidiLoad, DidUnload, etc.. 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Here i want to call Father Method 
    [FatherClass show_modal:indexPath]; 
} 

@end 

Когда я изменить ChildClass: UIViewController к ChildClass: FatherClass мой крах приложения.

+0

Нет ничего плохого в наследовании от UIViewController. Покажите свой код, как вы создаете «FatherClass» и «ChildClass». Получаете ли вы какие-либо ошибки или предупреждения от компилятора при создании этих классов? –

+0

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

+0

Если нет ошибок компилятора или предупреждений, связанных с кодом, который вы используете для создания ваших подклассов UIViewController, тогда может потребоваться обратная трассировка стека.Одной одной инструкции x86 внутри CFStringGetCharacters() действительно недостаточно контекста, чтобы дать представление о том, что происходит. –

ответ

1

Вы можете создать объект любого типа: объект с отцом NSObject или новый объект без какого-либо отца. Итак, вопрос: зачем использовать NSObject как отца? Поскольку он реализует каждый метод, необходимый для создания надежного класса, такого как init, dealloc и многое другое.

Таким образом, вы можете создать свою собственную иерархию, но вам нужно изобрести колесо, переписывающую каждый отдельный метод управления объектом.

+0

Я не хочу изобретать велосипед. Я просто хочу запустить метод, который имеет отец, и единственный метод, который должен управлять его отцом, а не сыном. Но ребенок должен позвонить и следовать за отцом. Стало яснее? или это было труднее? –

+0

Хорошо, я понял. Вы хотите что-то вроде trojanfoe, но если вы уже имплементируете это, как вы пишете, я думаю, что это не связано с вашей проблемой. Можете ли вы опубликовать некоторый код, чтобы узнать, как вы реализуете классы? –

+0

Я редактирую свой вопрос с кодом прямо сейчас, спасибо –

0

Вы всегда можете вызвать свойства и функцию родительского класса с помощью Self. Таким образом, вы код идет как

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Here i want to call Father Method 
    [Self show_modal:indexPath]; } 

И Вы никогда не присваивается свойство перед представлением

@property (nonatomic, strong) ChildClass *sidebar_table_controller; 

Так Ассинг свойство и вызвать функцию, как описано выше.