3 Stimmen

Gibt es eine bessere Möglichkeit, plist-y-Objekte in Objective-C zu serialisieren?

Ich mag die Möglichkeit der Serialisierung von Plisten für kleine Sammlungen von Objekten: Sie ist einfach, die Speicherung erfolgt in XML usw. Aber ich finde das Setzen von Werten in Wörterbüchern umständlich:

[myDict setObject:keepThis forKey:@"ivar"];

Ich würde es vorziehen, von Klassen abgeleitete Objekte (oder sogar nur Strukturen) zu verwenden:

myObj.ivar = keepThis

... und dann eine Nachricht an eine Sammlung senden, um eine Liste zu erhalten. Die zu diesem Zweck verwendeten Klassen/Strukturen könnten so eingeschränkt werden, dass sie direkt und einfach auf Plist-Primitive abgebildet werden können; zum Beispiel könnte myObj auf ein NSDictionary abgebildet werden und es könnte eine Anforderung an ivars gestellt werden, dass sie eines der Plist-Primitive sind.

Hat jemand bereits eine Anlage dafür gebaut, oder soll ich meine eigene entwickeln?

5voto

Sixten Otto Punkte 14771

Ich bin mir nicht sicher, ob es das ist, wovon Sie sprechen, aber Schlüsselwert-Codierung können Sie unter anderem Folgendes tun ein Wörterbuch mit Werten aus den Daten einer Instanz abrufen und auch Instanzdaten aus einem Wörterbuch setzen .

Es gibt auch eine Möglichkeit, die eine Instanz nach einer Liste ihrer Attribute fragen Es stellt sich jedoch heraus, dass man selbst etwas Code schreiben muss, damit das funktioniert. (Sie könnten allerdings die Laufzeit-Introspektion um das zu implementieren, wenn Sie wollen.) EDIT 2. Januar 2011: -[NSObject attributeKeys] erscheint nicht mehr in der iOS-Dokumentation. Ich habe den Link bearbeitet, um auf die Mac-Dokumentation zu verweisen, aber beachten Sie, dass dies möglicherweise nur auf dieser Plattform eine Option ist.

(Die NSCoding Protokoll ist eine weitere Möglichkeit, Ihre Objekte selbst zu speichern/wiederherzustellen, aber die Speicherung ist binär, nicht XML, und Sie sind immer noch dafür verantwortlich, jeden Wert, der Sie interessiert, zu holen/zu setzen, wenn das System Sie dazu auffordert).

3voto

nall Punkte 15613

Vielleicht möchten Sie sich informieren über diese SO-Frage in dem es darum geht, die Ivars einer Instanz zur Laufzeit in ein Wörterbuch aufzunehmen.

2voto

Ole Begemann Punkte 133946

Ein interessantes Projekt. Die Objective-C 2.0 Programmierhandbuch enthält einen Abschnitt über die Laufzeitfunktionen zum dynamischen Abrufen einer Liste der Eigenschaften einer Klasse:

objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount)

Damit sollte es recht einfach sein, eine Kategorie zu schreiben NSObject mit einer Methode, die die Liste der Eigenschaften abruft und sie in ein Wörterbuch stellt.

0voto

Chuck Punkte 228137

Um dafür Eigenschaften zu verwenden, müssten Sie einen vordefinierten Satz von möglichen Schlüsseln haben. Mit der Punkt-Syntax kann man keine beliebigen Namen verwenden - es muss sich um eine bekannte Eigenschaft oder einen Accessor des ersten Operanden handeln. Es kann also keine generische Form davon geben. Aber wenn Sie eine eigene Form erstellen, ist die Umwandlung in ein Wörterbuch so einfach wie [self dictionaryWithValuesForKeys:listOfProperties] .

0voto

jeff7091 Punkte 947

Ich habe dies an anderer Stelle gesehen, aber es ist genau das, wonach ich gesucht habe. Die Antworten oben verweisen auf die rohen Zutaten, aber hier ist es, alles verpackt: http://retaincount.com/blog/?p=7

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X