El problema es que NSUInteger
puede no tener el mismo tamaño que unsigned int
. En muchas (si no en la mayoría de las actuales) máquinas Mac OS X, NSUInteger
será un unsigned long
, que será el doble de grande. Por otro lado, un archivador con clave debe manejar eso sin problemas, ya que construye un diccionario.
El hecho de que NSCoder no tenga ningún método para tratar con tipos sin firmar es una complicación adicional. No puedo pensar en cómo esto podría causar la pérdida de datos, pero requeriría algunos lanzamientos feos, además de que se siente sucio.
Si desea insistir en un tipo sin signo, la forma más sencilla sería la de codificar los bytes sin formato (preferentemente en el orden de bytes de red mediante htonl
y ntohl
) en el tipo más grande disponible (unsigned long long
) usando encodeBytes:length:forKey:
y decodeBytesForKey:returnedLength:
. Para una seguridad máxima, debe verificar la longitud de lo que decodificó y lanzar el puntero (o usar una unión) para extraer el tipo de tamaño correcto.
El inconveniente de esto es que el valor se representará en la salida como datos, no como un número entero. Esto solo importa principalmente si alguien decide leer en los datos plist brutos para su archivo en lugar de usar el desarchivar con clave como lo hace, e incluso solo para ellos. Los otros casos en los que podría importar es si Apple (o usted) alguna vez debe cambiar a una arquitectura que tiene incluso tipos enteros más grandes, tipos cuyo tamaño en bits no es una potencia de dos (hay al menos una plataforma antigua donde una palabra era 24 bits), o tipos con un diseño inusual (no grande o poco endian).
En cuanto a su solución NSNumber: Es posible que desee abrir su archivo en el Editor de listas de propiedades y ver qué emitió. Si la salida contiene un elemento entero, entonces es lo mismo que usar encodeInteger:forKey:
. Si el resultado contiene un elemento de datos, entonces es el mismo que la solución que mencioné anteriormente. Para ser minucioso, debe verificar el resultado de cada arquitectura que admita.
No optimizaría su código para no crear objetos cuando lo escribe por primera vez. Es mejor hacer que algo funcione, que analizar en exceso el código que necesita para escribir. Perderás demasiado tiempo pensando y no tendrás suficiente tiempo para hacerlo. Es conveniente que mida el rendimiento más adelante y realice cambios si la creación del objeto se convierte en un problema. Perfilar en Xcode es una gran herramienta para aprender. –