使用正确的类型将 NSValue 转换为 NSData 并再次返回
Convert NSValue to NSData and back again, with the correct type
我希望能够将 objective-c 对象(例如 NSArray
或 UIImage
转换为 NSData
对象,然后我可以使用它来写入磁盘。我首先将它们转换为 NSValue
,然后我计划将其转换为 NSData
。 This question 提供了部分答案,但由于他们使用的是 NSNumber
,因此他们并不真的需要将其转换回 NSValue
。
我已经看到其他问题,例如 this one 依赖于 NSKeyedArchiver
,但由于 inflation 的规模很大,我想避开这个。
因此,从第一个问题开始,我目前用于从 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];
如何取回类型信息?
使用NSKeyedArchiver
保存项目,NSKeyedUnarchiver
恢复对象。该对象必须符合 NSCoding
并且在集合的情况下,所有包含的项目也必须符合 NSCoding
.
请参阅 NSKeyedArchiver and NSCoder
的 Apple 文档
您的方法仅适用于您的 NSValue 中的原始类型(int、float、没有指针的结构等)。否则你只会得到无意义的指针值,而不会得到 NSData 对象中的实际数据。
要同时传递实际的类型字符串,您还必须想办法将其放入 NSData 对象中。不是不可能,但解决不了你的实际问题。
按照 zaph 的建议使用键控存档器要好得多。
我希望能够将 objective-c 对象(例如 NSArray
或 UIImage
转换为 NSData
对象,然后我可以使用它来写入磁盘。我首先将它们转换为 NSValue
,然后我计划将其转换为 NSData
。 This question 提供了部分答案,但由于他们使用的是 NSNumber
,因此他们并不真的需要将其转换回 NSValue
。
我已经看到其他问题,例如 this one 依赖于 NSKeyedArchiver
,但由于 inflation 的规模很大,我想避开这个。
因此,从第一个问题开始,我目前用于从 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];
如何取回类型信息?
使用NSKeyedArchiver
保存项目,NSKeyedUnarchiver
恢复对象。该对象必须符合 NSCoding
并且在集合的情况下,所有包含的项目也必须符合 NSCoding
.
请参阅 NSKeyedArchiver and NSCoder
的 Apple 文档您的方法仅适用于您的 NSValue 中的原始类型(int、float、没有指针的结构等)。否则你只会得到无意义的指针值,而不会得到 NSData 对象中的实际数据。
要同时传递实际的类型字符串,您还必须想办法将其放入 NSData 对象中。不是不可能,但解决不了你的实际问题。
按照 zaph 的建议使用键控存档器要好得多。