NSMutable Array objectAtIndex: index außerhalb der Grenzen
Ich versuche einen Blick durch ein NSMutableDictionary beladen mit einem NSMutableArray und ich bin Durcheinander, und ich weiß nicht, wie. Ich versuche, laden Sie eine größere plist von Fragen zum Spiel, dann löschen Sie Sie, wenn Sie nicht das richtige Maß. Ich glaube nicht, erhalte eine Fehlermeldung, bis ich versuche, und löschen. Kann jemand sehen, der Fehler in diesem code? Würde ich super dankbar!
Dank,
~G
{
NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
NSString *GameLevel = [[NSString alloc] initWithFormat: [settings objectForKey:kLevelKey]];
NSBundle *Bundle = [NSBundle mainBundle];
NSString *PListPath = [Bundle pathForResource:@"questions" ofType:@"plist"];
NSMutableDictionary *Dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:PListPath];
self.QuestionDetailsByLevel = Dictionary;
[Dictionary release];
NSMutableArray *Components = [[NSMutableArray alloc] initWithArray:[QuestionDetailsByLevel allKeys]];
self.QuestionsByLevel = Components;
int QuestionCount = [self.QuestionsByLevel count] - 1;
for (int j = 0; j < QuestionCount - 1; j++)
{
NSString *SelectedQuestion = [self.QuestionsByLevel objectAtIndex:j];
NSMutableArray *Array = [QuestionDetailsByLevel objectForKey:SelectedQuestion];
self.QDetailsByLevel = Array;
NSString *level = [[NSString alloc] initWithFormat:[self.QDetailsByLevel objectAtIndex:Level]];
if (level != GameLevel)
[QuestionsByLevel removeObjectAtIndex:j];
}
}
Gibt es einen Grund, dass man alles in einer plist? Habe nur eine für jede Ebene, und dann laden Sie einfach die, die Sie brauchen.
InformationsquelleAutor | 2009-11-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von den anderen genannten Themen werden von allen anderen, konzentrieren wir uns auf warum gerade Sie immer einer out-of-bounds-Fehler.
Hier ist der code, der relevant ist.
Lassen Sie uns sehen, was passiert, nach ein paar Iterationen dieser code.
Erste iteration:
Zweite Iteration:
Dritte Iteration:
Vierte Iteration:
Können Sie das problem sehen? Deine for-Schleife übernimmt Sie die Objekte zugreifen, die von Ihrem index, aber dann nach jeder iteration, den Sie löschen etwas aus der Reihe, die verschiebt alle Indexe nach diesem Punkt. Sie sollte nicht aufgerufen werden
removeObjectAtIndex:
ist, weil Sie versuchen, durch zu gehen das array in der gleichen Zeit.Wenn Sie nur versuchen zu überspringen, ein bestimmtes Objekt, können Sie einfach rufen Sie "weiter", wenn Sie erreichen das Objekt. Wenn Sie wirklich wollen, um es zu entfernen aus dem array, rufen Sie einfach
[QuestionsByLevel removeObject:GameLevel]
. Oder was auch immer sinnvoll für Ihre situation. Aber das tun vor Sie das array Durchlaufen.InformationsquelleAutor BJ Homer
Dies ist nicht eine Antwort. Dies ist eine Kritik an deinem code.
GameLevel
,Components
, undlevel
, aber nie lassen Sie alle von Ihnen.GameLevel
muss nicht sein alloc/init-D an alle. Sie können nur ziehen Sie den Wert aus[settings objectForKey:kLevelKey];
ordnen Sie es in IhremGameLevel
string und verwenden. Dann brauchen Sie sich nicht einmal, es zu veröffentlichen.self.QDetailsByLevel
- Eigenschaft auf einen neuen Wert. Sind Sie sicher, dass das, was Sie wollen?if (level != GameLevel)
Nicht tun, was Sie denken, es tut. Das ist der Vergleich von Zeigern (dh die ADRESSEN der beiden Objekte im Speicher). In Ihrem gegenwärtigen Zustand, beidelevel
undGameLevel
wurden alloc/init würde, was bedeutet, dass Sie nie das gleiche Objekt. Sie sind wahrscheinlich zu wollenif ([level isEqualToString:GameLevel] == NO)
statt.[self.QuestionsByLevel count]
um IhreQuestionCount
int, das wäre eine Obere Schranke für eine for () - Schleife. Doch das bedingt, daß die for-Schleife (@Michael zeigte, um Ihr problem zu sein) subtrahiert anderen 1 vonQuestionCount
, was bedeutet, dass deine for () - Schleife wird nie erreichen, das Letzte element im array. Sind Sie sicher, dass das, was Sie wollen?initWithFormat:[settings objectForKey…]
ist immer falsch. Der Benutzer wird schreiben, die einen format-string, der gültig ist, erwartet aber, dass Argumente Sie nicht, es zu geben. Dann die app Abstürzen. Immer passieren entweder aus einer Konstanten Zeichenfolge (@"…"
) oder eine lokalisierte version von einer (NSLocalizedString(@"…", /*comment*/ @"Explanation of the string")
.Ich habe auch Fragen, die Anwesenheit von zwei Eigenschaften
QuestionDetailsByLevel
undQDetailsByLevel
, der verschiedenen Arten. asUwish, sollten Sie entweder wählen Sie eine oder das andere, oder geben einen von Ihnen oder beide bessere Namen.Wenn dies ausgeführt wird, auf einem Mac unter garbage collection, dann Punkt 1 ist strittig. Jedoch habe ich nie davon ausgehen, garbage collection, weil Sie weiß, wie die manuelle Verwaltung von Speicher ist ein sehr wertvolle Fähigkeit.
In der Tat. Es lohnt sich zu wissen, wie die manuelle Verwaltung von Speicher, weil Sie muss in der Lage sein zu tun, wenn Sie code schreiben, für ein framework, eine Bibliothek, plug-in (jeglicher Art, einschließlich der Farb-Picker und Bild-Einheiten), oder eine iPhone-Anwendung.
InformationsquelleAutor Dave DeLong
Das problem Auftritt, wenn ich mich nicht Irre, aufgrund der Tatsache, dass Sie ändern das Objekt, während Sie die Iteration über seinen Inhalt. Beim entfernen von Objekten aus der Liste, um Ihre Kündigung Bedingung ungültig wird. Versuchen Sie, die Umsetzung dieser als eine while-Schleife, und vorsichtig sein, um aktualisieren Sie Ihre Abbruchbedingung, wenn Sie entfernen Sie Elemente aus der Liste. Sie können auch verwenden Sie den debugger, um herauszufinden, wo Sie waren, out of bounds.
InformationsquelleAutor Michael Aaron Safyan