我正在使用面部倍增器应用程序,并试图确定它因错误而崩溃的原因;
[__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];
答案 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];
}