IPhone. Почему в документации говорят, что UIImageView совместим с NSCoding?
В идеале класс, совместимый с NSCoding, будет работать, как ожидалось, с помощью encodeWithCoder: и initWithCoder: (по крайней мере, я думал, что до недавнего времени), без того, чтобы разработчик не беспокоился о том, что происходит внутри подпрограмм (если моя идея о совместимом с NSCoding классом полностью прикручен!)
Класс UIImageView совместим с NSCoding. Поэтому мне не нужно беспокоиться о том, как он будет сериализован/де-сериализован с использованием классов NSKeyedArchiver и NSKeyedUnarchiver. Но каждый раз, когда я пытаюсь кодировать объект UIImageView, я получаю сообщение об ошибке, которое UIImage не распознает метод encodeWithCoder:.
Теперь UIImageView внутренне использует объект UIImage. Но не следует ли кодированию позаботиться об этом?
Или соответствие NSCoding, указанное в документации, просто позволяет пользователю узнать, что они могут реализовать методы initWithCoder и encodeWithCoder?
Кто-то может прояснить это для меня! Я полностью смущен!
Ответы
Ответ 1
Документация вводит в заблуждение - UIImage
не соответствует NSCoding
, как вы заявили. Вы можете обойти это (примитивным способом), выполнив работу самостоятельно:
@interface UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;
@end
@implementation UIImage (NSCoding)
- (id)initWithCoder:(NSCoder *)decoder {
NSData *pngData = [decoder decodeObjectForKey:@"PNGRepresentation"];
[self autorelease];
self = [[UIImage alloc] initWithData:pngData];
return self;
}
- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:UIImagePNGRepresentation(self) forKey:@"PNGRepresentation"];
}
@end
Ответ 2
Этот вопрос заслуживает обновления, поскольку iOS 5.1 добавила функциональность для NSCoding в UIImage, и ответ Натана де Фриза теперь вызывает предупреждения с последними компиляторами.
Этот вопрос предлагает решение для решения этой проблемы, если ваше приложение поддерживает iOS до 5.1. Он делает в основном то же самое, что предлагает Натан, но проверяет, существует ли метод уже или нет, а не жестко его кодирует.