我一直在关注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]);
}
答案 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)的情况下向现有类添加新方法时,类别特别有用。