/ / Wie kann ich “[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9] '” - ios, nsarray verhindern?

Wie kann ich verhindern "[__NSArrayM objectAtIndex:]: index 10 über Grenzen [0 .. 9] '" - ios, nsarray

Ich habe eine Knopfaktionsmethode, die einen Schleifenzähler verwendet, die Schleife läuft von 0 bis 9 und löst dann ein anderes Ereignis aus. Das Problem, das ich habe, ist, wenn der Knopf mehr als 10 Mal gedrückt wird, wirft er ein [__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]" error. Ich weiß, dass dies bedeutet, dass die Tastenbetätigung ausgeführt wurdeIch würde gerne wissen, wie ich verhindern kann, dass der Fehler auftritt, wenn er mehrmals ausgelöst wird, als für das Array konfiguriert wurde. Wenn die Aktion mehr als 10 Mal gestartet wird, stürzt die App nicht mit a ab [__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]. Jede Hilfe wäre toll.

Hier ist der Schleifenzähler:

-(void) gameLoop {

if (loopCounter < 10){
revealArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", nil];
cover1.alpha = 1.0;
cover2.alpha = 1.0;
cover3.alpha = 1.0;
cover4.alpha = 1.0;
cover5.alpha = 1.0;
cover6.alpha = 1.0;
cover7.alpha = 1.0;
cover8.alpha = 1.0;
coreView.alpha = 1.0;

NSDictionary *question = nil;

question = [questionsArray objectAtIndex:loopCounter];

questionImage.image = [UIImage imageNamed:[question objectForKey:@"imageNames"]];
[self getAnswers];
}
else {
//NSLog(@"finished");

[self animateResults];
}

}

Dieser Code erstellt das Array:

-(void) getAnswers {

Tribes *tribes = [[Tribes alloc]init];
[tribes createArray];
answersArray = [[tribes optionsArray]mutableCopy];

NSDictionary *question = nil;
question = [questionsArray objectAtIndex:0];

if ([[answersArray objectAtIndex:0] isEqualToString:[question objectForKey:@"answers"]] || [[answersArray objectAtIndex:1] isEqualToString:[question objectForKey:@"answers"]]){
[self getAnswers];
}

else {
[self answerLabelMethod];
NSLog(@"%@", answersArray);

questionTimer =[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(revealImage) userInfo:nil repeats:YES ];

}
}

Ich habe festgestellt, dass der Haltepunkt in dieser Methode ist:

- (void) answerMethod:(int)answerBtn {

if (answerBtn == random) {
//NSLog(@"correct!");
int maxScore = 10000;
int userScore = maxScore - (questionTimerCounter*1000);
NSLog(@"%d", userScore);
runningScore = runningScore + userScore;
NSLog(@"%d" , runningScore);

NSMutableDictionary *question = nil;
//either at this point
question = [[questionsArray objectAtIndex:loopCounter]mutableCopy];
//
[question setObject:[NSNumber numberWithBool:YES] forKey:@"correct"];
[question setObject:[NSNumber numberWithInt:userScore] forKey:@"score"];
[questionsArray replaceObjectAtIndex:loopCounter withObject:question];
}
else {

NSMutableDictionary *question = nil;
//or this point
question = [[questionsArray objectAtIndex:loopCounter]mutableCopy];
//
[question setObject:[NSNumber numberWithBool:NO] forKey:@"correct"];
[question setObject:[NSNumber numberWithInt:0] forKey:@"score"];
[questionsArray replaceObjectAtIndex:loopCounter withObject:question];

}

GameInProgress = NO;

loopCounter++;
[self revealAnswer];

}

Antworten:

1 für die Antwort № 1

Ich denke, Ihr "Fragenfeld" hat nicht so viel Kapazität für den Zugriff auf das 11. Element, da es nur 10 Elemente enthält (0 bis 9).

Platzieren Sie daher einen Haltepunkt in der Nähe dieser Linie, und Sie erhalten einen Hinweis, um das Problem zu beheben question = [questionsArray objectAtIndex: loopCounter];


0 für die Antwort № 2

Sie versuchen, Objekt am Index zu erhalten, der außerhalb des Bereichs liegt, denke ich. stellen breakpoint wenn nötig und überprüfen Sie die Arraysizes. hinzufügen exception breakpoint um zu überprüfen, wo Ihre App abstürzt.