2013-08-09 10 views
5

Мне нужно кодировать и декодировать свойство типа NSUInteger с NSCoder.Могу я использовать NSCoder :: encodeInteger: forKey: и decodeIntegerForKey: методы с аргументом типа NSUInteger?

Можно ли использовать методы NSCoder::encodeInteger:forKey: и NSCoder::decodeIntegerForKey: для этого?

Другой способ, который приходит мне на ум, состоит в том, чтобы сначала свернуть целое число без знака в NSNumber. Но это означает еще какой-то код, и мне это не нравится.

ответ

5

Безопасно ли использовать NSCoder :: encodeInteger: forKey: и NSCoder :: decodeIntegerForKey: методы для этого?

Да, это безопасно, потому что все архитектуры на OS X и прошивке использовать в двоичном дополнение для представления чисел со знаком. Например (в предположении, 32-разрядную архитектуру), в

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

n преобразуется в целое число с тем же представлением памяти, которая является -1.

И

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

подписанную целочисленного -1 преобразуется обратно в целое число без знака с тем же представлением памяти, так что вы получите обратно исходное значение.

+0

Сохраняется ли это для 64-битной архитектуры? – rmtheis

+0

@rmtheis: Да, я уверен, что это так (NSUInteger - это 64-разрядное целое на 64-разрядных архитектурах. Я просто привел пример для 32-разрядных). –