2012-03-09 2 views
1

В iOS 4, MKPlacemark не соответствует NSCoding.MKPlacemark и NSCoder в iOS 4 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, но я не могу избавиться желающих для проверки протокола и класса. Давайте послушаем это для дихотомии!