我有一个名为Calculator的类。这个类接受一堆测试分数,并将每个测试分数存储到一个数组中。这个数组叫做scoreArray。
我想像这样声明数组,但是我在使用范围时遇到了问题:
int scoreArray[numTestScores];
如果我将该代码放入@implementation,它不知道numTestScores是什么,因为它尚未传递给该类。
如果我尝试这样做:
-(id)init:(int)numTestScores_
{
if (self = [super init])
{
int scoreArray[numTestScores_];
}
return self;
}
然后创建数组,但是该类的其余部分不知道scoreArray是什么。
我怎样才能创建scoreArray,其长度为“numTestScores”,并且具有与我将其放入实现块中相同的范围?
答案 0 :(得分:3)
使用本机C数组是一种不必要的痛苦。我宁愿使用NSMutableArray
,将其声明为属性。
@property (nonatomic, copy) NSMutableArray *scores;
NSMutableArray
自动管理其内存,因此您无需提前声明其大小。
将其初始化为
_scores = [NSMutableArray array];
然后为其添加值
[self.scores addObject:@(aResult)]; //assuming that aResult is an integer expression
@(...)
将值包含在NSNumber
中,因为NSArray
只能保存对象。
要检索分数,您可以
int score = [self.scores[0] intValue];
答案 1 :(得分:1)
VLA(variable-length arrays)仅适用于......嗯......在有意义的地方。在这种情况下,您宁愿使用动态内存分配和实例变量:
@interface MyClass: NSObject {
int *array;
size_t size;
}
// ... etc ...
- (id)initWithSize:(size_t)n
{
if (self = [super init]) {
size = n;
array = malloc(size * sizeof array[0]);
}
return self;
}
// free the allocated memory upon destruction
- (void)dealloc
{
// ...
free(array);
// ...
[super dealloc];
}
至于为什么使用可变长度数组作为实例变量没有意义:实例变量是对象的一部分。如果在对象中声明了VLA,则实例的大小将取决于其初始化。这不是立即易于实现的东西,它不是Objective-C运行时的工作方式。 (我不是说这是不可能的,但这将是非常非常不切实际的。)
所有类都在编译时推断出它们的实例大小(好吧,主要是......现在它更像是运行时系统的初始化),并且以后不能更改它。因此,对象的大小不能从初始化到初始化。
答案 2 :(得分:0)
假设你正在编写一个正确包含的面向对象的类,那么你的得分集的实现对外界来说并不重要。确实如此,不要创建一个int数组,而是创建一个NSMutableArray
(如果你想预先填充numTestScores_
条目以便以后更容易,那就去做吧,但是不应该这样做真的需要它。
如果必须拥有数组,则必须通过将scoreArray
声明为int *
并使用malloc来动态分配它。但请注意 - 如果已创建数组,则必须在类中创建dealloc
方法free()
数组。