【问题标题】:Subclassing NSMutableArray子类化 NSMutableArray
【发布时间】:2012-12-02 10:58:27
【问题描述】:

我一直在 iTunes 上观看 CP193 课程,得到的常见信息是可重用性。

我正在创建一个具有 NSMutableArray 形式的列表的程序。我将一遍又一遍地访问这个类。

所以我创建了一个 NSMutableArray 类,其中包含一个在数组中设置 NSStrings 的函数

@interface Geology : NSMutableArray
- (void) setuparray;

在我的实现文件中

[super addobjects:@"object1"];

我想用里面已经存在的对象来初始化这个对象。我使用以下代码在 ViewController 中导入了头文件:

Geology *geology = [[Geology alloc] initWithCapacity:5];
[geology setuparray]; 
NSLog(@"%@", [geology objectAtIndex:1];

但是程序无法编译并出现以下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -[NSMutableArray initWithCapacity:]:仅为抽象类定义的方法。定义 - 地质 initWithCapacity:]!

因此,我需要在我的新文件中定义容量。但是,即使我在文件中添加 [Super initWithCapacity] 它仍然不起作用?

编辑:

地质学.h

@interface Geology : NSMutableArray
- (void) setupGeology;

@结束

地质学.m

@implementation Geology 
- (void) setupGeology{
    [super initWithCapacity:1];
    [super addObject:@"object1"];
}
@end

在我的 ViewController 我有

#import "Geology.h"

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.   
    Geology *geology = [[Geology alloc] initWithCapacity:5];
    [geology setupGeology];
    NSLog(@"%@", [geology objectAtIndex:1]);
}

【问题讨论】:

  • 你能显示 Geology.. 的 .h 和 .m 吗?
  • NSArray 是一个类簇。因此,即使您看到的公开类是 NSArray 和 NSMutableArray,它们也只是接口。您返回的实际对象可能来自无数类。这就是为什么从类集群子类化通常是一个坏主意的原因。但是,如果您必须进行子类化,请阅读文档中的子类化说明。基本上,您还必须从 NSMutableArray 和 NSArray 覆盖更多方法。
  • 啊,谢谢。我想我会放弃这个想法并重用代码。
  • 如果您需要/想要封装它,您可以使用类组合而不是子类化,这样您就不必担心类集群。

标签: iphone nsmutablearray


【解决方案1】:

首先你没有在你的 .h 和 .m 中声明和定义 initWithCapacity 因为 NSMutableArray 是一个抽象类,所以你需要定义这个,其次我不确定这是否是正确的方法去做... 每当您需要向现有类添加额外功能时,您总是可以在objective-c 中使用categories。当您需要向类添加额外的属性以及一些功能时,通常会进行子类化。

我认为你应该研究分类,因为继承 NSMutableArray 是一件非常罕见的事情,我从来没有觉得有必要这样做。

您可以参考此answer 以获得更清晰的信息。

【讨论】:

  • NSMutableArray 不是抽象类。我可以实例化一个就好了。另外,Objective C 实际上并没有抽象类。
【解决方案2】:

看起来您要做的就是为 NSMutableArray 创建一个自定义初始化程序,以便它更适合您在应用程序中使用它的方式。

您不必继承 NSMutableArray 来执行此操作。

如果您只想为现有类添加功能而不是添加额外的存储空间,您可以在 NSMutableArray 上创建一个类别来为您执行设置。

【讨论】:

    【解决方案3】:

    当它不合适时,你正在继承 NSArray。子类化用于特化或扩展。您在这里没有专门或扩展 NSArray - 您只是在使用它。所以像往常一样使用 NSArray;无需子类。所以你可能有一个包含 NSArray 作为属性的辅助数据对象。

    另外,我希望 NSArray 的子类至少在类名中包含“Array”。

    另请注意,在 Objective C 中向现有类添加功能时,有时会使用类类别而不是子类。当您想向现有类添加新方法而不添加任何新状态(即 ivars/properties)时,类别特别有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多