0

iOS 4 では、 にMKPlacemark準拠していませんNSCoding

iOS 5 では、経由でMKPlacemark準拠しています。NSCodingCLPlacemark

自分のキー/値 (アドレス帳以外)を使用-initWithCoordinate:addressDictionary:して問題を解決できるかどうかはわかりませんが、本当に気になるのはNSCoding.

特に、サブクラス化したとしましょうMKPlacemark。をサポートしたい場合はNSCoding、準拠している限り、スーパークラスを呼び出したいと思います。

興味深いのは、これ-conformsToProtocol:YESiOS 5iOS 4 で復活したことです!

iOS 4 では、スーパークラスが応答するかどうかを確認しても-encodeWithCoder:(プロトコルを確認したいのですが、どうでもいいです)、問題ありません。「ああ、あのセレクターに適合して対応するって言ったっけ?ああ!うん。いいえ。」(カブラモ。)

ここで OS のバージョンを確認したくありませんが、両方の場合に戻るとしたら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 に答える