NSRangeException索引超出边界错误

时间:2017-03-09 18:11:45

标签: ios objective-c iphone

我正在使用面部倍增器应用程序,并试图确定它因错误而崩溃的原因;

[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]'

我认为方法swapTapped会导致问题出现在某个地方......

//Create collection
    faceViews = [[NSMutableArray alloc] init];

int faceIndex;

- (IBAction)swapTapped:(id)sender {
    //Play sound
    [[AVAudio sharedAudio] playSound: @"explosion"];

    //Show flash
    [self.view bringSubviewToFront: self.flashView];
    self.flashView.alpha = 1.0;
    self.flashView.hidden = FALSE;
    [UIView animateWithDuration:0.5 animations:^{
        self.flashView.alpha = 0.0;
    } completion:^(BOOL finished) {
        self.flashView.hidden = TRUE;
    }];

    //Make all faces the same
    faceIndex++;

    if (faceIndex >= self.faceViews.count)
    {
        return;
    }

        FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; //  I believe it crashes here

    UIImage *baseImage = faceViewIndex.baseImage;
    for (FaceView *fv in self.faceViews)
        [fv setFaceImage: baseImage];
}

这是另一种方法;

-(void) swapFaces {
    //Deselect all faces
    [self deselectFaces];

    //Reset tag flag to zero
    for (FaceView *crtFaceView in self.faceViews)
        crtFaceView.tag = 0;

    //Swap each photo
    for (int i=0; i<[self.faceViews count];i++) {
        //Get current and next
        FaceView *crtFaceView = [self.faceViews objectAtIndex: i];
        FaceView *nxtFaceView = crtFaceView == [self.faceViews lastObject] ? [self.faceViews objectAtIndex: 0] : [self.faceViews objectAtIndex: i+1];

        //Only not swaped yet
        if (crtFaceView.tag == 0 && nxtFaceView.tag == 0) {
            //Change flag
            crtFaceView.tag = 1;
            nxtFaceView.tag = 1;

            //Calculate scale
            float ratioX = nxtFaceView.bounds.size.width / crtFaceView.bounds.size.width;
            float ratioY = nxtFaceView.bounds.size.height / crtFaceView.bounds.size.height;

            //Auto saturation matching
            crtFaceView.saturation = nxtFaceView.meanSaturation / crtFaceView.meanSaturation;
            crtFaceView.brightness = nxtFaceView.meanBrightness / crtFaceView.meanBrightness;

            //Auto flip
            if (crtFaceView.faceType != nxtFaceView.faceType && crtFaceView.faceType != 0 && nxtFaceView.faceType != 0) {
                crtFaceView.flipped = TRUE;
                nxtFaceView.flipped = TRUE;
            } else {
                crtFaceView.flipped = FALSE;
                nxtFaceView.flipped = FALSE;
            }

            //Animate to position
            [UIView beginAnimations: @"" context: nil];
            [UIView setAnimationDuration: 0.5];
            [UIView setAnimationCurve: UIViewAnimationCurveEaseOut];

            //Save original frame and transform
            CGPoint tempCenter = crtFaceView.originalCenter;
            CGAffineTransform tempTransform = crtFaceView.originalTransform;

            //Swap object one
            crtFaceView.center = nxtFaceView.originalCenter;
            crtFaceView.transform = CGAffineTransformScale(nxtFaceView.originalTransform, ratioX, ratioY);

            //Swap object two
            nxtFaceView.center = tempCenter;
            nxtFaceView.transform = CGAffineTransformScale(tempTransform, 1/ratioX, 1/ratioY);

            //Commit animation
            [UIView commitAnimations];
        }
    }
}

让应用程序崩溃的有保证的方法是按下swapTapped按钮3次,就像它循环一样,但是当它认为索引超出界限时会崩溃......?

编辑 - 它在此行崩溃;

FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex];

2 个答案:

答案 0 :(得分:0)

如果您希望克服此崩溃,请添加

 if(faceIndex < [self.faceViews count] && [self.faceViews count] > 0)  {
     FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; 
    }

答案 1 :(得分:-1)

//我不知道你在哪里准确增加

faceIndex++; 

    if (faceIndex < self.faceViews.count)
     {
     FaceView *faceViewIndex = [self.faceViews objectAtIndex: faceIndex]; 

        UIImage *baseImage = faceViewIndex.baseImage;
        for (FaceView *fv in self.faceViews)
            [fv setFaceImage: baseImage];

    }