将整数传递给类,然后创建大小为该整数的数组

时间:2013-11-18 22:33:15

标签: objective-c

我有一个名为Calculator的类。这个类接受一堆测试分数,并将每个测试分数存储到一个数组中。这个数组叫做scoreArray。

我想像这样声明数组,但是我在使用范围时遇到了问题:

int scoreArray[numTestScores];

如果我将该代码放入@implementation,它不知道numTestScores是什么,因为它尚未传递给该类。

如果我尝试这样做:

-(id)init:(int)numTestScores_
{
    if (self = [super init])
    {
        int scoreArray[numTestScores_];
    }
    return self;
}

然后创建数组,但是该类的其余部分不知道scoreArray是什么。

我怎样才能创建scoreArray,其长度为“numTestScores”,并且具有与我将其放入实现块中相同的范围?

3 个答案:

答案 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()数组。