【发布时间】: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