【问题标题】:Why inheritance need to be "subclass" NSObject?为什么继承需要是“子类”NSObject?
【发布时间】:2012-04-24 15:38:20
【问题描述】:

为什么继承必须从一个 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 我的应用程序崩溃。

【问题讨论】:

  • 从 UIViewController 继承没有错。展示如何创建“FatherClass”和“ChildClass”的代码。创建这些类时,您是否从编译器收到任何错误或警告?
  • 奇怪的是,这是使用 BreakPoint 而没有 BreakPoint 时唯一的错误。但我会编辑我的问题并输入代码给你看。
  • 如果没有与您用于创建 UIViewController 子类的代码相关的编译器错误或警告,则可能需要堆栈回溯。 CFStringGetCharacters() 中的一条 x86 指令确实不足以说明发生了什么。
  • 代码已修改,请查看是否更好,谢谢
  • 貌似show_modal是一个实例方法,但是你却试图调用FatherClass的一个类方法。

标签: objective-c inheritance subclass nsobject


【解决方案1】:

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

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

【讨论】:

  • 我不想重新发明轮子。我只想运行父亲拥有的方法,并且是唯一需要运行父亲而不是儿子的方法。但孩子必须呼唤并跟随父亲。变得更清楚了?还是更难?
  • 好的,我明白了。您想要类似 trojanfoe 的答案,但如果您在编写时已经实现了它,我认为这与您的问题无关。你能发布一些代码来看看你是如何实现这些类的吗?
  • 好的,谢谢。我看到的第一个错误是:[FatherClass show_modal:indexPath];方法“show_modal”不是类方法而是实例方法,所以如果你想调用它,你必须执行以下操作之一: - 创建一个新的 FatherClass 对象,然后调用它 - 从父亲扩展子并使用 [self show_modal:indexPath];你能试一下吗?现在让我来!
  • 你的意思是:fatherclass *ThaFather = [[fatherclass alloc] init];然后 [ThaFather show_modal:indexPath]; ?就是这样 ?我已经这样做了,我忘了放上面编辑的代码。
【解决方案2】:

您始终可以使用 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;

所以像上面一样分配属性并调用函数。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 2011-06-17
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2014-08-26
    • 2017-02-17
    相关资源
    最近更新 更多