Как преобразовать NSValue в NSData и обратно?

У меня есть несколько NSValue (полученных через KVC valueForKey), которые мне нужно добавить к объекту NSData, чтобы отправить его по сети с помощью Game Center. Очевидно, мне также нужно будет преобразовать NSValue обратно из NSData для большего количества KVC (setValue:forKey:).

Я не знаю точного типа каждого NSValue, поэтому я ограничен использованием интерфейсов, предоставляемых NSValue и NSData. Я должен отметить, что NSValue никогда не являются указательными типами.

Я удивлен, что нет [NSData dataWithValue:value], а также чего-то вроде [value dataWithEncoding:] или подобного. Но, возможно, я слеп и не вижу очевидного выбора. Я подумал об использовании getValue: для копирования значения в void* буфер, но как мне определить длину буфера, кроме как используя objCType и сравнивая его со всеми возможными типами?

Как мне поступить?

ПРИМЕЧАНИЕ: NSKeyedArchiver не обсуждается, потому что он ужасно неэффективен. Флоат размером 4 байта архивируется в NSData размером 142 байта, CGPoint размером 8 байт использует 260 байт при архивации в NSData. Сохранение минимального объема отправляемых данных имеет решающее значение для того, что я делаю.

11
задан Stunner 4 March 2014 в 03:16
поделиться