Lea*_*s2D 11 objective-c key-value-coding nscoding nsdata
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归档时使用260字节NSData.将发送的数据量保持在最低限度对我正在做的事情至关重要.
Lea*_*s2D 17
Martin Gordon的答案越来越近,但幸运的是,您不必手动解析objCType字符串.有一个函数可以做到这一点:NSGetSizeAndAlignment.从中你可以得到从getValue:获得的值的大小/长度.这个问题引导我找到解决方案.
我最终为NSData创建了一个类别,允许我从NSNumber或NSValue对象创建NSData:
@interface NSData (GameKitCategory)
+(NSData*) dataWithValue:(NSValue*)value;
+(NSData*) dataWithNumber:(NSNumber*)number;
@end
@implementation NSData (GameKitCategory)
+(NSData*) dataWithValue:(NSValue*)value
{
NSUInteger size;
const char* encoding = [value objCType];
NSGetSizeAndAlignment(encoding, &size, NULL);
void* ptr = malloc(size);
[value getValue:ptr];
NSData* data = [NSData dataWithBytes:ptr length:size];
free(ptr);
return data;
}
+(NSData*) dataWithNumber:(NSNumber*)number
{
return [NSData dataWithValue:(NSValue*)number];
}
@end
Run Code Online (Sandbox Code Playgroud)
我还在这个NSValue/NSNumber数据之前添加了一个小标题,它允许我解码数据的属性以及数据部分中的字节数.有了它,我可以将值恢复到远程属性.
| 归档时间: |
|
| 查看次数: |
5087 次 |
| 最近记录: |