Das Problem ist, dass NSUInteger
möglicherweise nicht die gleiche Größe wie eine unsigned int
haben. Auf vielen (wenn nicht sogar allen) Mac OS X Maschinen wird NSUInteger
eine unsigned long
sein, die doppelt so groß sein wird. Auf der anderen Seite sollte ein verschlüsselter Archiver das problemlos handhaben, da er ein Wörterbuch erstellt.
Noch komplizierter ist die Tatsache, dass NSCoder keine Methoden hat, um mit unsignierten Typen umzugehen. Ich kann mir nicht vorstellen, wie dies zu Datenverlust führen würde, aber es würde einige hässliche Würfe erfordern und es fühlt sich einfach nur schmutzig an.
Wenn Sie auf einen Typ ohne Vorzeichen bestehen wollen, wäre der einfachste Weg, die Roh-Bytes zu kodieren (vorzugsweise in Netzwerk-Byte-Reihenfolge htonl
und ntohl
verwendet) in der größten Art zur Verfügung (unsigned long long
) mit encodeBytes:length:forKey:
und decodeBytesForKey:returnedLength:
. Um maximale Sicherheit zu gewährleisten, sollten Sie die Länge der dekodierten Objekte überprüfen und den Zeiger (oder eine Union) umwandeln, um den Typ mit der korrekten Größe zu extrahieren.
Der Nachteil davon ist, dass der Wert in der Ausgabe als Daten, keine ganze Zahl dargestellt wird. Das ist hauptsächlich wichtig, nur wenn jemand entscheidet, die rohen plist-Daten für Ihr Archiv einzulesen, anstatt den verschlüsselten Unarchivierer wie Sie und nur dann nur für sie zu verwenden. Die anderen Fälle, in denen es darauf ankommt, ist, ob Apple (oder Sie) jemals zu einer Architektur mit noch größeren Integer-Typen wechseln sollte, deren Größe in Bits keine Zweierpotenz ist (es gibt mindestens eine alte Plattform, auf der ein Wort 24 war) Bits) oder Typen mit einem ungewöhnlichen Layout (nicht Big- oder Little-Endian).
Wie für Ihre NSNumber-Lösung: Sie möchten möglicherweise öffnen Sie Ihr Archiv im Eigenschaftenlisten-Editor und sehen, was es emittiert. Wenn die Ausgabe ein Integer-Element enthält, entspricht dies der Verwendung von encodeInteger:forKey:
. Wenn die Ausgabe ein Datenelement enthält, ist es dasselbe wie die oben erwähnte Lösung. Um gründlich zu sein, sollten Sie die Ausgabe von jeder unterstützten Architektur überprüfen.
Ich würde Ihren Code nicht für das Erstellen von Objekten nicht optimieren, wenn Sie es zuerst schreiben. Es ist besser, etwas zum Laufen zu bringen, als den Code, den Sie schreiben müssen, zu analysieren. Du wirst zu viel Zeit damit verschwenden zu denken und nicht genug Zeit zu haben. Sie möchten die Leistung später messen und Änderungen vornehmen, wenn die Objekterstellung zu einem Problem wird. Profiling in Xcode ist ein großartiges Tool zum Erlernen. –