我有一个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实际上并没有创建数组。那么我最初可以填充数组呢? 提前谢谢。
答案 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: