使用正确的类型将 NSValue 转换为 NSData 并再次返回

Convert NSValue to NSData and back again, with the correct type

我希望能够将 objective-c 对象(例如 NSArrayUIImage 转换为 NSData 对象,然后我可以使用它来写入磁盘。我首先将它们转换为 NSValue,然后我计划将其转换为 NSDataThis 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 的建议使用键控存档器要好得多。