0

在 iOS 4 中,MKPlacemark不符合NSCoding.

在 iOS 5 中MKPlacemarkNSCoding通过CLPlacemark.

我不确定我是否可以使用-initWithCoordinate:addressDictionary:我自己的键/值(在地址簿之外)并摆脱它,但我真正好奇的是NSCoding.

特别是,假设我已经将MKPlacemark. 如果我想支持NSCoding,我想调用超类,只要它符合。

有趣的是,iOS 5-conformsToProtocol:iOS 4 的回归!YES

在 iOS 4 上,即使我检查超类是否响应-encodeWithCoder:(我更喜欢检查协议,但无论如何),也没关系。“哦,我有没有说过我们符合并响应那个选择器?哦!是的。不。” (卡布拉莫。)

我不想在这里检查操作系统版本,但是,如果我要YES在这两种情况下都回来......(颤抖)。

4

1 回答 1

0

无论如何,我认为目前最好的做法是:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ([super conformsToProtocol:@protocol(NSCoding)] &&
        [super isKindOfClass:[CLPlacemark class]]) {
        [super initWithCoder:aDecoder];
    } else {
        // Homegrown MKPlacemark (ostensibly iOS 4.x) initWithCoder
    }
    // Subclass-specific initWithCoder
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
    if ([super conformsToProtocol:@protocol(NSCoding)] && 
        [super isKindOfClass:[CLPlacemark class]]) {
        [super encodeWithCoder:aCoder];
    } else {
        // Homegrown MKPlacemark (ostensibly iOS 4.x) encodeWithCoder
    }
    // Subclass-specific encodeWithCoder
}

我想这是多余的,因为CLPlacemark处理NSCoding,但我不能动摇想要检查协议与类。让我们来听听二分法吧!

于 2012-03-10T02:31:17.870 回答