使用正确的类型将 NSValue 转换为 NSData 并再次返回
Posted
技术标签:
【中文标题】使用正确的类型将 NSValue 转换为 NSData 并再次返回【英文标题】:Convert NSValue to NSData and back again, with the correct type 【发布时间】:2015-06-14 11:46:50 【问题描述】:我希望能够将objective-c 对象(例如NSArray
或UIImage
)转换为NSData
对象,然后我可以用它来写入磁盘。我首先将它们转换为NSValue
,然后我计划将其转换为NSData
。 This question 提供了部分答案,但是当他们使用 NSNumber
时,他们真的不需要将其转换回 NSValue
。
我已经看到其他问题,例如依赖于 NSKeyedArchiver
的 this one,但由于发生了巨大的规模膨胀,我想避开这个问题。
因此,从第一个问题开始,我目前从NSValue
编码NSData
对象的代码如下:
+(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
对象并从NSValue
取回原始objCType
?
我会假设我会按照这些思路使用一些东西
[NSValue valueWithBytes:[data bytes] objCType:typeHere];
如何取回类型信息?
【问题讨论】:
【参考方案1】:使用NSKeyedArchiver
保存项目并使用NSKeyedUnarchiver
恢复对象。对象必须符合NSCoding
,并且在集合的情况下,所有包含的项目也必须符合NSCoding
。
请参阅NSKeyedArchiver 和 NSCoder 的 Apple 文档
【讨论】:
【参考方案2】:您的方法仅适用于 NSValue 中的原始类型(int、float、没有指针的结构......)。否则你只会得到无意义的指针值,而不是你的 NSData 对象中的实际数据。
要同时传递实际的类型字符串,您还必须想办法在您的 NSData 对象中获取它。并非不可能,但它不会解决您的实际问题。
按照 zaph 的建议使用键控存档器会好得多。
【讨论】:
以上是关于使用正确的类型将 NSValue 转换为 NSData 并再次返回的主要内容,如果未能解决你的问题,请参考以下文章
为 CAAnimation 目的将 Swift 结构转换/包装为 NSValue?
Object - C 值对象 NSNumber和NSValue