Lista de propiedades
# Lista de propiedades

En los framework Mac OS X, iOS, NeXTSTEP y GNUstep, los archivos de lista de propiedades son archivos que almacenan objetos serializados. Estos archivos usan la extensión .plist, por lo que son conocidos como archivos plist (extensión cuyo nombre deriva de su abreviatura en inglés: Property List).

Los archivos de lista de propiedades se utilizan frecuentemente para almacenar configuraciones del usuario. También se utilizan para almacenar información sobre bundles y aplicaciones, lo que en el antiguo Mac OS se conseguía mediante el flujo de recursos de un archivo (resource fork).

Estos ficheros se operan con la clase NSPropertyListSerialization. Una lista de propiedades no puede contener más que objetos de tipo Core Foundation o Foundation Kit porque la biblioteca no permite serializar otros tipos de objetos.

## Formato

Debido a que la información representada en las listas de propiedades es en cierto sentido abstracta, el formato de archivo subyacente se puede implementar de múltiples formas. A partir del formato que NeXTSTEP usaba para representar estas listas, los subsecuentes GNUstep and Mac OS X introdujeron diferentes formatos.

### NeXTSTEP

En NeXTSTEP, los archivos plist se diseñaron para ser legibles por humanos y editables manualmente, serializados a ASCII en una sintaxis similar a un lenguaje de programación.

Las cadenas se representaban:

Los datos binarios se presentaban como:

Los arrays se representaban así:

Y los diccionarios:

Una limitación de las listas de propiedades originales de NeXT es que no podían representar objetos NSValue (número, booleano, etc.).

### GNUstep

GNUstep adopta el formato de NeXTSTEP con unos pocos añadidos: soporta objetos NSValue (que se representan como ASCII plano) y también objetos NSDate (que se representan como <*DYYYY-MM-DD HH:MM:SS timezone>).

GNUstep puede también leer y escribir archivos de propiedades en el formato usado por Mac OS X.

### Mac OS X

A pesar de que Mac OS X puede leer el formato de NeXTSTEP, Apple lo aparta en favor de sus dos nuevos formatos propios.

En Mac OS X 10.0, el formato de NeXTSTEP fue declarado obsoleto y se introdujo un nuevo formato XML, con una DTD pública definida por Apple. El formato XML soporta caracteres no-ASCII y objetos NSValue (que, al contrario que el formato ASCII de GNUstep, no es soportado por el formato ASCII de Apple).

Puesto que los archivos XML, sin embargo, no son el método más eficiente en espacio de almacenamiento, Mac OS X 10.2 introdujo un nuevo formato donde los archivos de lista de propiedades eran almacenados como archivos binarios. A partir de Mac OS X 10.4, este es el formato por defecto para los archivos de preferencias. En Mac OS X 10.7, se introdujo soporte para lectura y escritura de archivos en formato JSON. Sin embargo, JSON y plist no son completamente compatibles. Por ejemplo, los archivos de propiedades soportan un tipo de fecha nativo, mientras que los JSON no. En el otro sentido, JSON permite valores null para las claves, mientras que las listas de propiedades no lo soportan de forma explícita.

La utilidad plutil (introducida en Mac OS X 10.2) se puede utilizar para comprobar la sintaxis de los archivos plist o convertirlos de un formato a otro. Además, el comando defaults (introducido en NeXTSTEP) se puede emplear para manipular archivos plist utilizados para almacenaje de preferencias (conocidos antes de OS X como defaults, de ahí el nombre) desde la línea de comandos vía su dominio de preferencias, y también puede utilizarse para editar archivos plist arbitrarios.

Las listas de propiedades XML y JSON son manualmente editables con cualquier editor de texto. Adicionalmente, Apple proporciona soporte en Xcode para editar listas de propiedades en un visor/editor jerárquico que puede manejar plists en formato binario o XML, pero no en JSON. Desde Mac OS X 10.4, Apple proporciona una interfaz de AppleScript para leer archivos de lista de propiedades. A partir de Mac OS X 10.5, se introdujo una interfaz de AppleScript para además editar, crear y escribir archivos plist.

Para el formato XML, las etiquetas, las clases de Foundation y los tipos de CoreFoundation, y los formatos de almacenamiento de los datos son los siguientes:

| Clases de Foundation | Tipos de CoreFoundation | Etiquetas XML | Formato de almacenamiento |
| - | - | - | - |
| NSString | CFString | <string> | Cadena de texto UTF-8 |
| NSNumber | CFNumber | <real>, <integer> | Cadena en decimal |
| NSNumber | CFBoolean | <true/> or <false/> | Sin contenido (sólo etiqueta) |
| NSDate | CFDate | <date> | Cadena con formato ISO 8601 |
| NSData | CFData | <data> | Datos codificados en Base64 |
| NSArray | CFArray | <array> | Puede contener cualquier número de elementos hijos Un array vacío se puede representar como <array/> |
| NSDictionary | CFDictionary | <dict> | Alternando etiquetas <key> y etiquetas de elementos plist |
