为什么继承需要是“子类”NSObject?

时间:2012-04-24 15:38:21

标签: objective-c inheritance subclass nsobject

为什么继承必须以NSObject开头,然后在另一个类中使用继承?

不知道为什么我有一个来自UIViewController的子类“FatherClass”。 所以我想创建一个继承FatherClass(ChildClass:FatherClass)。

我不能这样做,我得到一个错误日志。 我在这里搜索的所有例子和Google都以NSObject作为父亲开始。

所以我的问题必须如此?或者我错了。

这是错误日志

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

由于

使用代码编辑

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我的应用程序崩溃。

2 个答案:

答案 0 :(得分:1)

您可以创建每种类型的对象:具有NSObject父对象的对象或没有任何父对象的新对象。 所以问题是:为什么要使用NSObject作为父亲?因为它实现了创建健壮类所需的每个方法,比如init,dealloc等等。

因此,您可以创建自己的层次结构,但必须重新发明轮子重写每个方法来管理对象。

答案 1 :(得分: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;

所以协助财产并按上述方式调用该函数。