MKPlacemark и NSCoder в iOS 4 против iOS 5

В iOS 4 MKPlacemark не соответствует NSCoding,

В iOS 5 MKPlacemark соответствует NSCoding в порядке CLPlacemark,

Я не уверен, что смогу использовать -initWithCoordinate:addressDictionary: с моими собственными ключами / значениями (за пределами адресной книги) и сойти с рук, но то, что мне действительно интересно, это NSCoding,

В частности, скажем, я подкласс MKPlacemark, Если я хочу поддержать NSCodingЯ хотел бы позвонить в суперкласс, если он соответствует.

Интересно то, что -conformsToProtocol: возвращается YES на iOS 5 и iOS 4!

На iOS 4, даже если я проверю, отвечает ли суперкласс на -encodeWithCoder: (Я предпочитаю проверять протокол, но все равно), неважно. "О, я сказал, что мы подчиняемся и отвечаем этому селектору? О! Да. Нет." (Ка-blammo.)

Я бы предпочел не проверять версии ОС здесь, но, если я собираюсь вернуться YES в обоих случаях... (вздрагивает).

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

Другие вопросы по тегам