Ich habe versucht, den NSKeyedArchiver dazu zu bringen, meine Daten in einer für Menschen lesbaren Form auszugeben (d. h. nicht als Binärdatei). Ich verstehe, dass ich ...
verwenden kann %Vor%Aber ... ich kann einfach nicht die Syntax richtig finden, kann mir jemand in die richtige Richtung zeigen?
%Vor%Ich habe setOutputFormat hinzugefügt (siehe unten), aber beim Kompilieren bekomme ich eine Warnung, was fehlt mir?
%Vor%Hier ist der Code, den ich benutzt habe.
%Vor%Gary
Das musst du tun:
%Vor% Beachten Sie, dass Sie [archiver encodeObject:artistCollection forKey:@"root"]
anstelle von [archiver encodeRootObject:artistCollection];
verwenden müssen, wie von Sean vorgeschlagen. Dies liegt daran, dass NSKeyedArchiver NSCoder encodeRootObject: method nicht überschreibt. Ich halte dies für einen Fehler und werde es Apple melden.
Nun, die eigentliche Frage ist, warum Sie XML anstelle des Standard-Binärformats schreiben wollen? Wenn es zum Zweck der Fehlersuche ist, schlage ich vor, dass Sie TextWrangler verwenden, mit dem Sie Binär-Plist-Dateien transparent bearbeiten können, als ob sie waren XML.
'archivedDataWithRootObject:' ist eine Klassenmethode, während 'setOutputFormat' eine Instanzmethode ist. Aus der Dokumentation für 'archivedDataWithRootObject:':
Ein NSData-Objekt, das die codierte Form des Objektdiagramms enthält, dessen Stammobjekt rootObject ist. Das Format des Archivs lautet NSPropertyListBinaryFormat_v1_0.
Sie müssen einen NSKeyedArchiver erstellen und das Root-Objekt codieren. Stellen Sie außerdem sicher, dass alle Inhalte Ihrer Sammlung "encodeWithCoder" und "initWithCoder" implementieren. Sehen Encoding and Decoding Objects
Das Problem bei diesem Ansatz besteht darin, dass Sie für jedes Objekt, das Sie kodieren, manuell Schlüssel zuweisen müssen. Es klingt nicht wie gewünscht, da Sie bereits eine Sammlung haben. Sowohl Arrays als auch Wörterbücher enthalten Methoden zum Schreiben in eine XML-Datei, was ein viel einfacherer Ansatz ist.
%Vor%Diskussion über diese Methode (für NSDictionary und NSArray):
Wenn der Inhalt des Empfängers alle Eigenschaftenlistenobjekte (NSString-, NSData-, NSArray- oder NSDictionary-Objekte) sind, kann die von dieser Methode geschriebene Datei verwendet werden, um ein neues Array mit der Klassenmethode arrayWithContentsOfFile: oder der Instanzmethode initWithContentsOfFile zu initialisieren: . Diese Methode überprüft rekursiv, dass alle enthaltenen Objekte Eigenschaftslistenobjekte sind, bevor die Datei geschrieben wird, und gibt NEIN zurück, wenn alle Objekte keine Eigenschaftslistenobjekte sind, da die resultierende Datei keine gültige Eigenschaftsliste wäre. Blockquote
Tags und Links objective-c cocoa