【发布时间】:2012-01-16 20:34:06
【问题描述】:
A 有许多 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 字节浮点数归档到 142 字节 NSData,8 字节 CGPoint 在归档到 NSData 时使用 260 字节。将发送的数据量保持在最低限度对我的工作至关重要。
【问题讨论】:
-
NSValue 支持 NSCoding,因此您可以使用 NSKeyedArchiver 或 NSArchiver 创建 NSData 表示。
-
您可以随时添加一个类别,根据 objcType 变量将其转换为数据。
标签: objective-c nsdata key-value-coding nscoding