0

我一直在看 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]);
}
4

3 回答 3

1

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

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

您可以参考这个答案以获得更清晰的信息。

于 2012-12-02T11:21:37.500 回答
0

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

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

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

于 2012-12-02T11:31:07.453 回答
0

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

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

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

于 2012-12-02T13:16:39.243 回答