2012-03-09 12 views
1

iOS 4では、MKPlacemarkNSCodingに準拠していません。iOS 4とiOS 5のMKPlacemarkとNSCoder

iOS 5では、MKPlacemarkNSCodingに準拠し、CLPlacemarkに準拠しています。

-initWithCoordinate:addressDictionary:を自分のキー/値(アドレス帳の外)で使用してもらえないか分かりませんが、本当に興味があるのはNSCodingです。

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

興味深いことに、-conformsToProtocol:は、iOS 5のYESを返します。 iOS 4!

iOS 4では、スーパークラスが-encodeWithCoder:(私はプロトコルをチェックすることを好むが、whatevs)に応答するかどうかをチェックしても問題ありません。 "ああ、私はそのセレクタに順応して応答すると言ったのですか?ああ、そうです。" (Ka-blammo。)

ここでOSのバージョンをチェックしたくないのですが、もし私がどちらの場合でもYESを返そうとしたら...(シャダー)。

答えて

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を処理しますが、私は望んで振ることができないので、それは、冗長だと仮定クラスとプロトコルをチェックする。二分法について聞いてみましょう!

関連する問題