子类化NSMutableArray

时间:2012-12-02 10:58:28

标签: iphone nsmutablearray

我一直在关注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]它仍然不起作用?

编辑:

Geology.h

@interface Geology : NSMutableArray
- (void) setupGeology;

@end

Geology.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]);
}

3 个答案:

答案 0 :(得分:1)

首先,你没有在.h和.m中声明和定义initWithCapacity,因为NSMutableArray是一个抽象类,所以你需要定义它,其次我不确定这是不是正确的方法要做到这一点......每当你需要为现有类添加额外的功能时,你总是可以在objective-c中使用类别。当你需要为类添加额外的属性以及一些功能时,子类化就完成了。

我相信你应该研究类别,因为子类化NSMutableArray是一件非常罕见的事情,我从来没有觉得有必要这样做。

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

答案 1 :(得分:0)

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

您不必将NSMutableArray子类化为此。

如果您要做的只是向现有类添加功能而不添加额外存储,您只需在NSMutableArray上创建一个类别,为您执行设置。

答案 2 :(得分:0)

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

另外,我希望NSArray的子​​类至少在类名中有'Array'。

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