2011-01-17 5 views
0

Ich bin zur Zeit Fehlersuche Code von einem anderen Kollegen geschrieben, der eine Out of Bounds Fehler mit dem folgenden Code hat. Sie müssen ein Element in einem UINavigatorController auswählen. Es beinhaltet auch die Verwendung von coreData.out of bounds Fehler repopulating Array für Ziel c app (iPhone)

der Code sieht wie folgt aus (ein Teil des Codes wurde für die Fehlerbehebung und Klarheit entfernen war)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

// : so far no errors with these lines of code. indexPath returns [0,0] or [0,1]; 
NSLog(@" : *** DetailViewController/didSelectRowAtIndexPath() - executing method ..."); 
NSLog(@" : *** DetailViewController/didSelectRowAtIndexPath() - indexPath = %@",indexPath); 

// : returns row number (as an integer) 

NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() indexPath.row = %d",indexPath.row); 

// : managedObject returns coreData information. 
// Directory *managedObject = (Directory *)[finalArray objectAtIndex:indexPath.row]; 
// NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() managedObject = %@",managedObject); 

// example return 

/* 
    <Directory: 0x5919e50> (entity: Directory; id: 0x59195d0 <x-coredata://FE8A3A0C-A0E4-4E0E-A90D-8471227D2284/Directory/p3> ; data: { 
    ID = 48; 
    IsFile = 0; 
    LastChanged = "2011-01-04 14:39:00 +0000"; 
    Name = "All Papers by Author"; 
    ParentID = 7; 
    Type = pdf; 
    } 
*/ 

// : returns the ID value from the managed object 
self.num = [managedObject ID]; 
NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() self.num (managedObject.ID) = %@",[managedObject ID]); 


NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:finalArray]; 

// : finalArray has two elements when this method runs 
NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]); 

[self.finalArray removeAllObjects]; // releases the objects, but makes the array empty; 

// : finalArray after remove all objects runs 
NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]); 

// ** THE OUT OF BOUNDS ERROR OCCURS HERE ** 
[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];** 


// NSLog(@": DetailViewController/didSelectRowAtIndexPath() finalArray is %@",self.finalArray); 

// ... more code here, but not relevant. 

// : release the temp NSMutable array 

[tempArray release]; 

// : maybe release the finalArray? 


} 

Wenn ich die app debuggen, glaube ich finalArray soll (removeAllObjects) gelöscht werden und soll eine außerhalb der Grenzen Fehler

App beenden aufgrund nicht abgefangene Ausnahme ‚NSRangeException‘, Grund zu werden wieder aufgefüllt, aber ich bekomme: ‚* - [NSMutableArray objectAtIndex:]: Index 1 über Grenzen für leere Array‘

Nicht sicher, wo der Fehler herkommt, so für ein paar Ratschläge und Tipps suchen ...

EDIT: Ich habe eine neue Spur Anweisung nach der Anweisung removeAllObjects

// : finalArray after remove all objects runs 
NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]); 

es eine Zählung von 0 zurück Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Also sollte ich dann vermuten, dass es, weil es keine Länge hat, keinen Platz hat, Speicher neu zuzuordnen, um neue Gegenstände hinzuzufügen Ich dachte, so würden Mutable-Arrays funktionieren (mehr oder weniger).

EDIT 2: Statt setArray, ich habe auch versucht, ObjectsFromArray hinzufügen, diese zu ersetzen:

[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];** 

// mit diesem

[self.finalArray addObjectsFromArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]]; 

aber ich hatte ein ähnlicher Fehler (außerhalb der Grenzen) zurück ...

+0

Sie bitte Ihre Post bearbeiten und die mitgelieferte „Code“ Markup verwenden, um das Beispiel zu machen lesbar . Es ist sehr schwierig, Ihr Beispiel zu lesen, um das Problem zu identifizieren. Führen Sie außerdem Ihre App im Debugger und in der Identität aus, welche Zeile diese Ausnahme auslöst (im Xcode "run" -Menü gibt es eine "break on objective-c exceptions" -Option, die helfen sollte). Sobald Sie die für Ihren Unfall verantwortliche Linie identifizieren können, sollten Sie besser vorbereitet sein, um die zugrunde liegende Ursache zu identifizieren. – Jonah

+0

Ich habe den Debugger ausgeführt. Die Codezeile, die den Fehler verursacht hat, war [self.finalArray setArray: [self searchDatabase: [self.num intValue] mit Predicate: @ "ParentID"]]; . Ich habe den Code oben überarbeitet, um dies zu verdeutlichen. Vielen Dank für Ihr Feedback. – djeddiej

+0

@ Jonah Ich habe die Frage bearbeitet, um es richtig zu formatieren ... :) –

Antwort

1

Die -setArray: ersetzt die vorhandenen Elemente mit den Elementen aus dem Array, das Sie übergeben. So ist die -removeAllObjects redundant, aber das ist nicht die Ursache deines Problems.

Die Größe des Arrays senden Sie -setArray: völlig irrelevant ist so wahrscheinlich das Problem in dem Array liegt, um die Elemente aus, dh die, die Sie aus bekommen bekommen:

[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"] 

ich, dass trennen würde, indem eine temporäre Variable zuweisen und dann im Debugger vor dem -setArray: und nach dem -setArray: untersuchen (setzen Sie die Option "Break on OBjective-C Exceptions").

+0

Ich führe die Untersuchung dieses Problems basierend auf Ihren Kommentaren fort und werde den Thread aktiv halten. Vielen Dank für Ihr Feedback! – djeddiej

+0

Jeremy Ich habe Ihnen ein Häkchen gegeben, da Ihr allgemeiner Fehlersuchtipp mich auf den richtigen Weg geführt hat. danke – djeddiej

+0

@djeddiej: Danke für die Punkte. Technisch gesehen sollten Sie jedoch die Antwort auf die Antwort geben, die die Frage am besten beantwortet, selbst wenn es Ihre eigene ist. Denken Sie daran, dass es nicht nur darum geht, die richtige Antwort auf Ihre Frage zu erhalten, sondern auch darum, ein Wissens-Repository für andere Personen bereitzustellen. Also, wenn Sie denken, Ihre Antwort würde mehr Menschen helfen als meine, sollten Sie Ihre Entscheidung ändern. – JeremyP

0

Ich entschied die Antwort auf das Problem (und es ist irgendwie albern) ... Ich sollte den Code, den ich oben geschrieben habe, etwas Kontext geben.

Der Zweck des Codes bestand darin, einen UINavigationController zum Anzeigen von Informationen zu Verzeichnissen und Dateien zu verwenden. Das Problem lag in der Logik des Codes. finalArray war eine Liste von dem, was angezeigt werden musste (d. h. eine Liste von Verzeichnissen oder Dateien) und tempArray enthielt das aktuelle Verzeichnis.

Alles, was ich brauchte etwas zusätzlichen Code, um die Länge anzugehen ...

// the following code was placed BELOW the code listing in the original question 

if ([finalArray] count == 0){ 
    // other code here 
    finalArray = tempArray; // reassign the current value (a list of files in this case) back to the current array... 
} else { 

    // we will assign finalArray with the value of TempArray first, as "we are not done recursing through" 
    finalArray = tempArray; 

    // other code here 

} 

Der außerhalb der Grenzen Fehler auftauchten als Folge der Navigation in UINavigationController zu einem Kind Blick durch und die „Zurück“ -Taste zu schlagen. Da die Anzeige nicht mit den neuen Menüeinträgen aktualisiert wurde (egal ob es sich um Dateien oder Ordner handelt), war "finalArray" ständig mit dem, was tatsächlich angezeigt wurde, nicht kompatibel. Es könnte also zwei Einträge geben, aber finalArray referenzierte eins Eintrag, ob es sich um eine Datei oder einen Ordner handelte).

Hope this Sinn und Dank an alle macht, die auf diese Frage sah ...

Grüße

Edward