3

好的,这是我程序中的一种方法,它不断给出 EXC_BAD_ACCESS 错误并崩溃。我指出了下面的行。questionsShown 是一个读写属性,它指向一个 NSMutableArray,我在程序的较早位置初始化了一个容量为 99 的 NSMutableArray。当我调试时,就分配的属性而言,一切看起来都很正常。我认为内存管理肯定存在一些问题,但我很难找到问题所在。提前感谢您的帮助。

@synthesize questionList;
@synthesize questionLabel;
@synthesize questionsShown;

-(IBAction)next{
int numElements = [questionList count];
int r;
if (myCount == numElements){
    [questionLabel setText:@"You have seen all the questions, click next again to continue anyways."];
    [questionsShown release];
    questionsShown = [[NSMutableArray alloc] initWithCapacity:99];
    myCount = 0;
}
else {
    do {
        r = rand() % numElements;
    } while ([questionsShown indexOfObjectIdenticalTo:r] != NSNotFound);
    NSString *myString = [questionList objectAtIndex:(NSUInteger)r];
    [questionLabel setText:myString];
    myCount++;
    [questionsShown addObject:r]; //results in crash with message EXC_BAD_ACCESS
    myCount++;
}
}
4

1 回答 1

10

EXC_BAD_ACCESS 来自 dereferencing r,它只是一个整数。您的编译器应该在该行上给您一个警告(从整数生成指针而不进行强制转换)。

如果 questionsShown 应该是为您设置的某种索引(它似乎是),您可能想要使用该类,或者您必须将整数放入 NSNumber 对象中。所以:

[questionsShown addObject:[NSNumber numberWithInt:r]];

当你阅读它时:

[questionsShown indexOfObjectIdenticalTo:[NSNumber numberWithInt:r]]

但是,我建议您查看NSIndexSet 文档

使用可变索引集,您可以执行以下操作:

[questionsShownIndexSet containsIndex:r]

[questionsShownIndexSet addIndex:r]
于 2010-07-02T03:08:10.573 回答