Подтвердить что ты не робот

IPhone. Почему в документации говорят, что UIImageView совместим с NSCoding?

В идеале класс, совместимый с NSCoding, будет работать, как ожидалось, с помощью encodeWithCoder: и initWithCoder: (по крайней мере, я думал, что до недавнего времени), без того, чтобы разработчик не беспокоился о том, что происходит внутри подпрограмм (если моя идея о совместимом с NSCoding классом полностью прикручен!)

Класс UIImageView совместим с NSCoding. Поэтому мне не нужно беспокоиться о том, как он будет сериализован/де-сериализован с использованием классов NSKeyedArchiver и NSKeyedUnarchiver. Но каждый раз, когда я пытаюсь кодировать объект UIImageView, я получаю сообщение об ошибке, которое UIImage не распознает метод encodeWithCoder:.

Теперь UIImageView внутренне использует объект UIImage. Но не следует ли кодированию позаботиться об этом?

Или соответствие NSCoding, указанное в документации, просто позволяет пользователю узнать, что они могут реализовать методы initWithCoder и encodeWithCoder?

Кто-то может прояснить это для меня! Я полностью смущен!

4b9b3361

Ответ 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. Он делает в основном то же самое, что предлагает Натан, но проверяет, существует ли метод уже или нет, а не жестко его кодирует.