代码之家  ›  专栏  ›  技术社区  ›  wfbarksdale

不可想象的原因导致访问错误

  •  3
  • wfbarksdale  · 技术社区  · 14 年前

    好的,这是我程序中的一个方法,它不断地给exc-bad-u访问错误和崩溃。我在下面画了线。显示的问题是一个读写属性,指向一个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++;
    }
    }
    
    1 回复  |  直到 14 年前
        1
  •  10
  •   Jason Coco    14 年前

    exc ou bad ou访问来自取消引用 r ,它只是一个整数。编译器应该在该行上给出一个警告(从整数中生成指针而不进行强制转换)。

    如果所显示的问题应该是为您设置的某种索引集(看起来是这样),您可能希望使用该类,或者必须将整数框入nsnumber对象中。所以:

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

    当你读到它时:

    [questionsShown indexOfObjectIdenticalTo:[NSNumber numberWithInt:r]]
    

    不过,我建议您看看 NSIndexSet documentation .

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

    [questionsShownIndexSet containsIndex:r]
    

    [questionsShownIndexSet addIndex:r]