Nach vier Wochen des Lernens von Objective-C für das iPhone ist meine erste nützliche Anwendung fast fertig. Ich muss jedoch immer noch mehrere Instanzvariablen speichern, wenn die aktuelle Ansicht geändert wird, und sie erneut laden, wenn die Ansicht erneut geöffnet wird.Wie kann eine verkettete Liste effizient aus einer Datei mit Objective-C gespeichert/geladen werden?
Ich habe keine Probleme Laden von Variablen mit grundlegenden C-Typen wie int und BOOL, aber habe Schwierigkeiten mit einer verknüpften Liste aus Objective-C-Objekten.
der verketteten Liste besteht aus Speicher durch drei Zeiger zugegriffen: startPointer, currPointer und Endzeiger. Jedes Element besteht aus einem letzten Zeiger, einem nächsten Zeiger, einem Zeiger auf eine verschachtelte verkettete Liste (nestedPtr), und einige Variablen.
Mein erster Versuch war die folgend in der Lade Code zu tun:
//dataStorageObj will contain the values to be loaded
dataStorageObj = [[DataSaver alloc] init];
NSData *data =[[NSMutableData alloc] initWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:@"Archive"]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
dataStorageObj = [unarchiver decodeObjectForKey:@"KeyForViewA"];
[unarchiver finishDecoding];
//****************************
//Simple variables loaded here
//****************************
//DataSaver is a class with methods to retrieve its instance variables
//The methods are named after the values they retrieve
startPointer = [dataStorageObj startPointer];
currPointer = [dataStorageObj currPointer];
endPointer = [dataStorageObj endPointer];
[unarchiver release];
[data release];
ich einen Debug-Punkt am Ende platziert und alle Variablen hatten die richtigen Werte. Der Zugriff auf die Werte im Code (dies geschah in der Konsole) führte zu EXC_BAD_ACCESS Nachrichten.
Als nächstes änderte ich die Liste verknüpft Ladeleitungen auf die folgenden:
startPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj startPointer]];
currPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj currPointer]];
endPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj endPointer]];
Die initPointerFromList Methode:
-(PointerClass *)initPointerFromList:(PointerClass *)theList
{
last = theList.last;
nestedPointer = [[NestedPointerClass alloc] initNestedPointerFromList:theList.nestedPointer];
//****************************************
//Other variables loaded from theList here
//****************************************
if (theList.next != nil)
{
next = [[PointerClass alloc] initPointerFromList:theList.next];
}
return self;
}
Das Problem war nun, dass die Zeiger alle Zeige waren zu einzelnen verknüpften Listen, also habe ich Methoden geschrieben, um die Anfangs- und Endpositionen der verknüpften Liste abzurufen, auf die currPointer verweist:
currPointer = [[PointerClass alloc] initPointerFromList:[dataStorageObj currPointer]];
endPointer = [currPointer lastElement];
startPointer = [currPointer firstElement];
Meine Frage ist dreifach:
- Ist es notwendig, Methoden zu verwenden, wie initPointerFromList Speicher für eine geladene verknüpften Liste zuzuordnen?
- Gibt es eine effizientere Art und Weise die Beziehung zwischen currPointer, Endzeiger und startPointer als durch die Suche durch die Liste mit dem lastElement und first Methoden zu halten?
- Ist etwas falsch mit den Techniken hinter dem Ladecode, den ich vorgestellt habe? Ohne es habe ich keine Probleme; damit bekomme ich immer noch BAD_ACCESS Nachrichten. Ich möchte wissen, ob diese Nachrichten an den Ladecode gebunden sind oder ob ich die Objektzuordnung im Rest meiner Anwendung so gehandhabt habe.
Vielen Dank im Voraus!
Vielen Dank für Ihre schnelle Antwort. Ich werde versuchen, NSMutableArray zu verwenden. – user80495