2012-03-09 70 views
1

在iOS 4中,MKPlacemark不符合NSCodingiOS 4中的MKPlacemark和NSCoder vs iOS 5

在iOS 5中,MKPlacemark符合NSCoding通過CLPlacemark的方式。

我不確定我是否可以使用-initWithCoordinate:addressDictionary:以及我自己的密鑰/值(地址簿之外)並避開它,但我真正好奇的是NSCoding

特別是,假設我已經子類MKPlacemark。如果我想支持NSCoding,我想調用超類,只要它符合。

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

在iOS 4,即使我檢查,看看是否超響應-encodeWithCoder:(我寧願檢查協議,但whatevs),不管。 「噢,我是否說我們遵守並回應了這個選擇器?哦,是的,沒有。」 (Ka-blammo。)

我不想在這裏檢查操作系統版本,但是,如果我要在兩種情況下都返回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,但我不能動搖希望檢查協議與類。讓我們聽聽它的二分法!