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

Posted

技术标签:

【中文标题】使用正确的类型将 NSValue 转换为 NSData 并再次返回【英文标题】:Convert NSValue to NSData and back again, with the correct type 【发布时间】:2015-06-14 11:46:50 【问题描述】:

我希望能够将objective-c 对象(例如NSArrayUIImage)转换为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?

NSNumber和NSValue

Object - C 值对象 NSNumber和NSValue

如何在 Swift 3 中将字典表示为 NSValue?

这应该如何正确地从 Objective C 转换为 swift 3

NSNumber 与NSValue