MKPlacemark и NSCoder в iOS 4 против iOS 5 - PullRequest
0 голосов
/ 09 марта 2012

В 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 Ответ

0 голосов
/ 10 марта 2012

Я думаю, что в любом случае лучше всего сделать что-то вроде этого:

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

...