【问题标题】:MKPlacemark and NSCoder in iOS 4 vs iOS 5iOS 4 与 iOS 5 中的 MKPlacemark 和 NSCoder
【发布时间】:2012-03-09 17:48:06
【问题描述】:

在 iOS 4 中,MKPlacemark 不符合 NSCoding

在 iOS 5 中,MKPlacemark 通过 CLPlacemarkNSCoding 一致。

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

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

有趣的是,-conformsToProtocol: 在 iOS 5 iOS 4 上返回 YES

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

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

【问题讨论】:

    标签: objective-c ios4 mapkit nscoding mkplacemark


    【解决方案1】:

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

    - (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,但我无法动摇想要检查协议与类。让我们来听听二分法吧!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多