NSKeyedArchiver und NSKeyedUnarchiver mit NSMutableArray

Ich hoffe, das hat nichts mit der Tatsache zu tun, dass ich hier ein Mutable-Array verwende, aber dieses verwirrt mich, sodass es mich nicht wundert, wenn das der Fall wäre.

HINTERGRUND:

Ich habe eine kleine Datenbank erstellt, die im Wesentlichen ein NSMutableArray ist, das benutzerdefinierte Objekte enthält, die wir recordObjects nennen können. Ich habe das Array eingerichtet:

<code>database = [[NSMutableArray alloc] init];
</code>

und mein benutzerdefiniertes Objekt mit dem Namen "recordObject" enthält die folgenden Variablen und Inits:

<code>NSString *name;
int       anInt;
Bool      aBool;
</code>

Ich habe auch Methoden synthetisiert, damit ich Anrufe tätigen kann wie:

<code>aString = [[database objectAtIndex:someIndex] name];
</code>

Außerdem wurden meiner Controller-Klasse Methoden hinzugefügt, um die einzelnen Datensätze für die Anzeige hinzuzufügen, zu entfernen und auszuwählen. Soweit funktioniert alles korrekt und genau wie erwartet.

Als Nächstes habe ich meine recordObject-Klasse (Unterklasse von NSObject) so eingerichtet, dass sie den NSCoder verwendet (durch Aufnahme in die @ interface-Direktive), und der Implementierungsdatei die folgenden benutzerdefinierten Encoder- und Decoder-Methoden hinzugefügt:

<code>-(void) encodeWithCoder: (NSCoder *) encoder {
    [encoder encodeObject: name  forKey: @"recordName"];
    [encoder encodeInt:    anInt forKey: @"recordInteger"];
    [encoder encodeBool:   aBool forKey: @"recordBool"];
}

-(id) initWithCoder: (NSCoder *) decoder {
    name    = [decoder decodeObjectForKey: @"recordName"];
    anInt   = [decoder decodeIntForKey:    @"recordInteger"];
    aBool   = [decoder decodeBoolForKey:   @"recordBool"];
}
</code>

Um die Datei zu schreiben, habe ich Folgendes verwendet:

<code>[NSKeyedArchiver archiveRootObject:database toFile:myPath];
</code>

Wenn ich das Programm starte, scheint alles korrekt zu funktionieren. Die Encoder-Methode wird für jeden Datensatz im Array aufgerufen, und die Datei wird auf die Festplatte geschrieben. Das Öffnen der Datei mit TextEdit zeigt, dass die Daten dort sind (obwohl sie für mich größtenteils unverständlich sind.)

DAS PROBLEM:

Hier stoße ich auf einen Haken.

Ich habe den folgenden Code hinzugefügt, um die Datei in mein Datenbankarray zu laden:

<code>database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
</code>

Wenn ich das Programm erneut starte, scheint es beim Laden der Datenbank korrekt zu funktionieren. Mein erster Test war die Verwendung der NSMutableArray-Zählmethode:

<code>x = [database count];
</code>

Das Ergebnis war, dass X mit der richtigen Anzahl von Datensätzen in der Datei gefüllt ist. Wenn beim Speichern der Datenbank 5 Datensätze vorhanden waren, wird X nach dem Laden der Datenbank bei der nächsten Ausführung des Programms auf 5 gesetzt.

Hier ist das große Problem:

Das Programm stürzt ab, wenn ich versuche, eine meiner Zugriffsmethoden zu verwenden. Wenn ich beispielsweise versuche, nach dem Laden der Datenbank Folgendes zu verwenden:

<code>aString = [[database objectAtIndex:someIndex] name];
</code>

Das Programm stürzt ab und gibt den folgenden Fehler in der Konsole zurück:

<code>Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
</code>

Meine Interpretation ist, dass die Daten aus irgendeinem Grund nicht korrekt in das Datenbank-Array geladen und initialisiert werden, aber für mein Leben kann ich nicht herausfinden, wo ich hier falsch gelaufen bin.

Als Randnotiz kam alles, was ich implementiert habe, aus Stephen G. Kochans Buch "Programming in Objective-C"

Irgendwelche Ideen wäre sehr dankbar!

Antworten auf die Frage(4)

Ihre Antwort auf die Frage