如何创建新的NSMutableArray?

时间:2011-01-25 17:41:19

标签: iphone objective-c ios4

我有一个NSMutableArray,只在会话期间持续。 目前我像这样创建它

NSMutableArray *temp = [[NSMutableArray alloc] initWithCapacity:10];
    [self setScoreArray:temp];
    [temp release];

问题是当我去检查每个索引时,我得到一个数组outofbounds错误

NSNumber *previousScore = [[self scoreArray] objectAtIndex:[self quizNum]];
    if ( previousScore != nil ) 
    {
        [self clearQuizBtns];
        NSInteger previousScoreValue = [previousScore integerValue];
        [self selectButtonAtTag:previousScoreValue];
    }else {
        [self clearQuizBtns];
    }

我在其他帖子中读到initWithCapacity实际上并没有创建数组。那么我最初可以填充数组呢? 提前谢谢。

5 个答案:

答案 0 :(得分:4)

两种方式:

首先:启动默认值为NSNull class

的数组
NSMutableArray *temp = [[NSMutableArray alloc] initWithCapacity:10];
for (int i = 0 ; i < 10 ; i++)
{
    [temp insertObject:[NSNull null] atIndex:i];
}

[self setScoreArray:temp];
[temp release];

然后检查:如果对象是某种类型的NSNull类,则意味着它是一个从未设置过的

id previousScore = [[self scoreArray] objectAtIndex:[self quizNum]];
if (![previousScore isKindOfClass:[NSNull class]]) 
{
    [self clearQuizBtns];
    NSInteger previousScoreValue = [(NSNumber *)previousScore integerValue];
    [self selectButtonAtTag:previousScoreValue];
}else {
    [self clearQuizBtns];
}

:在NSMutableDictionary中存储分数并使用NSNumber作为键

// scoreDictionary property of NSMutableDictionary class must be declared in self

NSNumber *previousScore = [self.scoreDictionary objectForKey:[NSNumber numberWithInt:[self quizNum]]];
if (previousScore != nil) 
{
    [self clearQuizBtns];
    NSInteger previousScoreValue = [previousScore integerValue];
    [self selectButtonAtTag:previousScoreValue];
}else {
    [self clearQuizBtns];
}

答案 1 :(得分:2)

NSArray不支持“漏洞”。容量只是初始化器的一个提示。

您可以使用占位符对象填充数组,或者更常见的是,将算法更改为完全预填充数组或延迟线性加载。

答案 2 :(得分:2)

你的问题似乎是你从未在得分数组中设置任何分数..是吗? NSArrays中包含实际count个项目,正如您所见,访问超出该计数的索引将会爆炸。如果只有固定(小)数的分数,比如10,那么你可以将它们全部设置为默认值,如:

for (int i = 0; i < 10; i++) {
    [temp addObject:[NSNumber numberWithInt:0]];
}

P.S。 -initWithCapacity执行“创建数组”,它不会在数组中创建任何对象。容量只是一个暗示。

答案 3 :(得分:0)

使用arrayWithObject:或arrayWithObjects:方法可以为数组提供预先填充的值。

答案 4 :(得分:0)

关于NSMutableArrays的一个很酷的事情是你可以只做一个“init”,数组将处理动态添加和删除对象。请记住,在处理可变数组时,通常会添加addObject:或removeObjectAtIndex: