为什么我不能在NSKeyedArchiver中编码NSValue?

nev*_*ing 7 cocoa objective-c mapkit nsvalue uikit-state-preservation

我试图对一个MKMapView中心进行编码并跨越一个NSKeyedArchiver状态保存.我找到了几个方便的新MapKit NSValue添加,valueWithMKCoordinate:valueWithMKCoordinate:.尝试将这些编码到密钥存档器中失败:

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    NSValue *mapCenterValue = [NSValue valueWithMKCoordinate:mapView.centerCoordinate];
    NSValue *mapSpanValue = [NSValue valueWithMKCoordinateSpan:mapView.region.span];
    [coder encodeObject:mapCenterValue forKey:kMapCenter];
    [coder encodeObject:mapSpanValue forKey:kMapSpan];
}
Run Code Online (Sandbox Code Playgroud)

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSKeyedArchiver encodeValueOfObjCType:at:]:此归档程序无法对结构进行编码

我知道这个问题的解决方案是将单个双打编码为四个单独的密钥.

我的问题是为什么会发生这种情况.一个NSValue是一个对象,为什么它告诉我"这个归档器不能编码结构"

das*_*ght 4

根据该NSKeyedArchiver课程的文档,

键控存档与非键控存档的不同之处在于,编码到存档中的所有对象和值都有给定的名称或键。

为了归档 a 的元素struct并为其提供密钥,NSKeyedArchiver需要元数据来了解 a 的每个字段的struct位置以及这些字段的名称是什么。存储@encode的 withNSValue为它提供了有关 a 布局的足够信息struct,但缺少有关每个字段名称的信息。

由于 a 中没有关于字段名称的元数据struct,因此不可能以确保正确取消归档的方式归档数据。这就是为什么NSKeyedArchiver必须拒绝NSValue使用嵌入式 C进行归档struct