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