2

我希望能够将一个objective-c对象,例如一个NSArrayUIImage转换成一个NSData对象,然后我可以用它来写入磁盘。我首先将它们转换为NSValue,然后我计划将其转换为NSData. 这个问题提供了部分答案,但是当他们使用. 时NSNumber,他们真的不需要将其转换回NSValue.

我已经看到了其他问题,例如这个依赖于 的问题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以这种方式编码的对象并objCTypeNSValue?

我会假设我会使用这些方面的东西

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

我将如何取回类型信息?

4

2 回答 2

1

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

请参阅NSKeyedArchiverNSCoder的 Apple 文档

于 2015-06-14T11:56:36.523 回答
1

您的方法仅适用于 NSValue 中的原始类型(int、float、没有指针的结构......)。否则,您将仅获得无意义的指针值,而不会获得 NSData 对象中的实际数据。

要同时传递实际的类型字符串,您还必须想办法在您的 NSData 对象中获取它。并非不可能,但它不会解决您的实际问题。

使用 zaph 建议的键控存档器要好得多。

于 2015-06-14T12:16:49.850 回答