Iphone 子类化NSMutableArray

Iphone 子类化NSMutableArray,iphone,nsmutablearray,Iphone,Nsmutablearray,我一直在看itunes上的CP193类,其中最常见的信息是可重用性 我正在创建一个程序,它有一个NSMutableArray形式的列表。我将一次又一次地访问这个类 因此,我创建了一个NSMutableArray类,其中包含一个在数组中设置NSString的函数 @interface Geology : NSMutableArray - (void) setuparray; 在我的实现文件中 [super addobjects:@"object1"]; 我想用已经在里面的对象初始化这个对象。我

我一直在看itunes上的CP193类,其中最常见的信息是可重用性

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

因此,我创建了一个NSMutableArray类,其中包含一个在数组中设置NSString的函数

@interface Geology : NSMutableArray
- (void) setuparray;
在我的实现文件中

[super addobjects:@"object1"];
我想用已经在里面的对象初始化这个对象。我使用以下代码在ViewController中导入了头文件:

Geology *geology = [[Geology alloc] initWithCapacity:5];
[geology setuparray]; 
NSLog(@"%@", [geology objectAtIndex:1];
但是,程序编译时不会出现以下错误:

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

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

编辑:

地质学

@interface Geology : NSMutableArray
- (void) setupGeology;
@结束

地质学

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

首先,你没有在你的.h和.m中声明和定义initWithCapacity,因为NSMutableArray是一个抽象类,所以你需要定义它,其次我不确定这是否是正确的方法。。。无论何时需要向现有类添加额外功能,都可以在objective-c中使用类别。当您需要向类添加额外的属性和一些功能时,子类化通常是完成的

我认为您应该研究一下类别,因为子类化NSMutableArray是一件非常罕见的事情,而且我从未觉得有必要这样做


为了更清楚,您可以参考此内容。

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

要做到这一点,您不必为NSMutableArray创建子类


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

如果NSArray不合适,您就是在对其进行子类化。子类化用于专门化或扩展。你不是在专门研究或扩展NSArray,你只是在使用它。所以,正常使用NSArray;不需要子类。因此,您可能有一个包含NSArray作为属性的帮助器数据对象

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


还要注意,在Objective C中向现有类添加功能时,有时会使用类类别,而不是子类化。当您希望向现有类添加新方法而不添加任何新状态(即IVAR/属性)时,类别特别有用

你能展示一下地质学的.h和.m吗?.NSArray是一个类群。因此,即使您看到的公开类是NSArray和NSMutableArray,它们也只是接口。您返回的实际对象可能来自无数个类。这就是为什么从类集群中生成子类通常是个坏主意。然而,如果你必须子类化,那么请阅读文档中的子类化注释。基本上,还有一些方法需要从NSMutableArray和NSArray重写。啊,谢谢。我想我会放弃这个想法,重新使用代码。如果你需要/想要封装它,你可以使用类组合而不是子类化,这样你就不必担心类集群。NSMutableArray不是一个抽象类。我可以很好地实例化一个。另外,Objective C实际上并没有抽象类。