# Property List

Eine Property List (dt. Liste von Eigenschaften), umgangssprachlich auch plist(-Datei, „P-List“ ausgesprochen) oder Property-Liste, dient dazu, Daten strukturiert abzulegen. Technisch geschieht dies durch die Serialisierung von assoziativen Datenfeldern (englisch auch dictionaries). In der Regel tragen solche Dateien die Endung .plist im Dateinamen.
Das Property-List-Format wurde seinerzeit für NeXTStep entwickelt und in macOS, iOS und Co. übernommen; auch in GNUstep, dem freien OpenStep- bzw. Cocoa-Nachbau, kommen sie zum Einsatz.

## Funktionen

Sie eignen sich besonders dafür, serialisierte Objekte bzw. Eigenschaften (properties) einer Klasse aufzunehmen.
Das Format unterscheidet die Datentypen Data, String, Date, Integer und Float sowie Arrays und Dictionaries.
Die beiden heute gültigen plist-Formate sind auf XML-Basis beziehungsweise binär. Sie werden vom System gleichermaßen unterstützt, sind zueinander kompatibel und können ineinander konvertiert werden.
Die Dateien werden häufig genutzt, um Einstellungen des Benutzers zu speichern. Weiterhin besitzt jedes Application Bundle mindestens eine Datei namens Info.plist, in der Informationen über das Bundle enthalten sind.

## Geschichte

In NeXTStep wurde ein Dateiformat zur Serialisierung assoziativer Arrays (im Grunde verschachtelte Werte, die einen Namen für die Zuweisung oder eine ID haben) eingeführt. Entwickler konnten so einfach z. B. Einstellungen oder Informationen abspeichern und auslesen. Da macOS ein Nachfahre von NeXTStep ist, übernahm es auch das plist-Datenformat. Apple erklärte damals das bisherige plist-Format von NeXTStep als ungültig und führte ein neues auf der Basis von XML ein, das den Funktionsumfang seines Vorgängers übernahm und gleichzeitig neue Datentypen hinzufügte. GNUstep, eine freie Implementierung von OpenStep bzw. Cocoa, übernahm das alte Format aus Gründen der Kompatibilität und erweiterte es um zwei Datentypen.

## Darstellung

Da die Daten, die in diesen Dateien gespeichert werden können, sehr abstrakt sind, lassen sie sich auf vielfältige Art und Weise speichern. Im Lauf der Zeit hat sich das Format der Dateien verändert; so nutzte NeXTStep ein anderes Format, als macOS und GNUstep dies tun.

### NeXTStep

Die plist-Dateien unter NeXTStep waren darauf ausgelegt, von Menschen lesbar und von Hand veränderbar zu sein; deswegen wurden sie als ASCII serialisiert.
Die Datentypen wurden so dargestellt:
| Datentyp | Darstellung |
| Strings | "Ein Beispiel-String" |
| Binärdaten | < [Hexadezimal-Code in ASCII] > |
| Arrays | ("1", "2", "3") |
| Dictionaries / assoziative Arrays | { "key" = "value"; ... } |
Ein Nachteil dieses Formates war, dass keine NSValue (Zahl, Boolean usw.) gespeichert werden konnten.

### GNUstep

GNUstep übernahm das plist-Format von NeXTStep, nahm aber einige Änderungen vor. Zum einen wurden NSValues unterstützt (dargestellt als ASCII), zum anderen wurde der neue Datentyp NSDate hinzugefügt (Darstellung: <*DYYYY-MM-DD HH:MM:SS timezone>). Damit war es nun möglich, auch das Datum in einer Property List zu speichern.
Weiterhin kann GNUstep das plist-Format von macOS lesen und schreiben.

### macOS

Zwar kann macOS das alte NeXTStep-Format noch immer lesen, aber bei seiner Einführung (damals Mac OS X 10.0) wurde das NeXTStep-Format als veraltet deklariert und ein neues, auf XML basierendes plist-Format eingeführt. Apple veröffentlichte dafür eine Dokumenttypdefinition.
Da XML-Dateien zwar von Menschen lesbar, aber dadurch sehr speicherineffizient sind, wurde mit Mac OS X 10.2 ein neues binäres plist-Format eingeführt. Die beiden Formate sind kompatibel und können mit plutil umgewandelt werden.
XML-plist-Dateien können grundsätzlich per Hand bearbeitet werden. Da dies aber ab einer gewissen Komplexität ein mühevolles Unterfangen ist, lieferte Apple mit dem Xcode-Paket bis Version 3.2 den Property List Editor mit aus. Ab Xcode 4.0 ist der Editor in die Xcode-IDE (Integrierte Entwicklungsumgebung) integriert. Des Weiteren ist es möglich, mittels AppleScript durch Aufrufen von defaults ebenfalls plist-Dateien zu lesen und zu schreiben.
Ab Mac OS X Lion bietet plutil auch die Möglichkeit, plist-Dateien in JSON umzuwandeln und umgekehrt.
Das Kommandozeilen-Tool defaults war ursprünglich dafür gedacht, Einstellungen von Programmen über die Shell ändern zu können. Da diese Dateien jedoch in aller Regel plist-Dateien sind, lassen sich mit dem Tool auch beliebige plist-Dateien verändern.
Im Laufe der Zeit haben Entwickler für die verschiedensten Programmiersprachen plist-Editoren und Bibliotheken entwickelt, die plist-Dateien serialisieren und in Datentypen der jeweiligen Sprache konvertieren können.
In plist-Dateien im XML-Format sind für die folgenden Datentypen (und die zugehörigen Cocoa- und Core-Foundation-Typen) die folgenden Tags gültig:
| Datentyp | XML-Tag | Cocoa-Typ | CoreFoundation-Typ |
| UTF-8-kodierte Zeichenkette | <string> | NSString | CFString |
| Dezimalzahlen (als String) | <real> oder <integer> | NSNumber | CFNumber |
| Boolean (wahr/falsch) | <true /> oder <false /> | NSNumber | CFBoolean |
| String (ISO-8601-formatiert) | <date> | NSDate | CFDate |
| Base64-kodierte Daten | <data> | NSData | CFData |
| Array (kann beliebig viele Unterelemente aufnehmen) | <array> | NSArray | CFArray |
| Assoziatives Array/dictionary (abwechselnd <key>-Tags und plist-Elemente) | <dict> | NSDictionary | CFDictionary |