好的,这是我的程序中的一个方法,它一直给出EXC_BAD_ACCESS错误并崩溃。我在下面说明了这一行。 questionsShown是一个readwrite属性,指向一个NSMutableArray,我在程序的早期点初始化容量为99。当我调试时,就所分配的属性而言,所有内容都显得正常。我认为内存管理一定存在问题,但我在查找问题时遇到了严重问题。提前感谢您的帮助。
@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++;
}
}
答案 0 :(得分:10)
EXC_BAD_ACCESS来自解除引用r
,它只是一个整数。你的编译器应该在那一行给你一个警告(从没有强制转换的整数做出指针)。
如果questionShown应该是某种类型的索引(它看起来像是),你可能想要使用该类,或者你必须在NSNumber对象中打包整数。所以:
[questionsShown addObject:[NSNumber numberWithInt:r]];
当你读到它时:
[questionsShown indexOfObjectIdenticalTo:[NSNumber numberWithInt:r]]
但我建议您查看NSIndexSet documentation。
使用可变索引集,您可以执行以下操作:
[questionsShownIndexSet containsIndex:r]
和
[questionsShownIndexSet addIndex:r]