objective-c - 将 NSValue 转换为 NSData,然后以正确的类型再次转换回来

标签 objective-c core-data nsdata nsvalue

我希望能够转换 Objective-C 对象,例如 NSArrayUIImage进入NSData对象,然后我可以使用它写入磁盘。我首先将它们转换为 NSValue ,然后我计划将其转换为 NSDataThis question提供了部分答案,但当他们正在使用NSNumber时,他们实际上并不需要将其转换回 NSValue .

我见过其他问题,例如 this one依赖于NSKeyedArchiver ,但由于会发生巨大的尺寸膨胀,我想避免这种情况。

因此,我目前的代码用于编码 NSData来自 NSValue 的对象,从第一个问题来看,如下:

+(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已以这种方式编码的对象并返回原始 objCType来自NSValue

我假设我会使用类似的东西

[NSValue valueWithBytes:[data bytes] objCType:typeHere];

我如何取回类型信息?

最佳答案

使用NSKeyedArchiver保存项目,使用NSKeyedUnarchiver恢复对象。该对象必须符合 NSCoding,并且在集合的情况下,所有包含的项目也必须符合 NSCoding

请参阅 Apple 文档 NSKeyedArchiverNSCoder

关于objective-c - 将 NSValue 转换为 NSData,然后以正确的类型再次转换回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828964/

相关文章:

objective-c - 从 Cocoa 中的文件中只读取 "N"字节

ios - 在 Swift 中将整数转换为 NSData

ios - UITableViewCell 中的 UIButton 使表格滚动不流畅

使用 GCD 或 NSThread 的 iOS 长时间运行操作?

ios - 核心数据 IOS : How to create an object with values without it being marked as having changes

data-structures - 存储部分更改数组的时间序列的最有效的数据结构是什么?

swift - 如何在 Swift 数据对象中写入新数据

iOS 二进制数据列未显示在 Sqlite 数据库中?

ios - 标签栏问题: -[UILayoutContainerView hash]: message sent to deallocated instance

ios - 应用程序卡住直到将数据保存到核心数据中