2013-08-09 10 views
5

Potrzebuję kodować i dekodować właściwość typu NSUInteger z NSCoder.Czy mogę używać NSCoder :: encodeInteger: forKey: and decodeIntegerForKey: metody z argumentem typu NSUInteger?

Czy można bezpiecznie stosować metody NSCoder::encodeInteger:forKey: i NSCoder::decodeIntegerForKey:?

W drugą stronę przychodzi mi do głowy, aby najpierw wprowadzić liczbę całkowitą bez znaku w NSNumber. Ale to oznacza trochę więcej kodu i nie podoba mi się to zbytnio.

Odpowiedz

5

Czy można bezpiecznie korzystać NSCoder :: encodeInteger: forKey a NSCoder :: decodeIntegerForKey: Metody że?

Tak, to jest bezpieczne, ponieważ wszystkich architekturach na OS X i iOS korzystać z uzupełnienie dwójkowe za reprezentowanie podpisane liczb. Dla przykładu (przy założeniu, że strukturę 32-bitowy), w

NSUInteger n = 0xFFFFFFFF; 
[aCoder encodeInteger:n forKey:@"n"]; 

n przekształca się podpisany całkowite z tej samej reprezentacji pamięci, która jest -1.

I

NSUInteger n = [aDecoder decodeIntegerForKey:@"n"]; 

podpisany całkowitej -1 jest przekształcany z powrotem do liczby całkowitej bez znaku z taką samą reprezentację pamięci, tak aby odzyskać pierwotną wartość.

+0

Czy ta odpowiedź jest prawdziwa w architekturze 64-bitowej? – rmtheis

+0

@rmtheis: Tak, jestem prawie pewien, że tak (NSUInteger jest 64-bitową liczbą całkowitą w architekturach 64-bitowych, podałem przykład tylko dla 32-bitowych). –

Powiązane problemy