12

理想情况下,一个符合 NSCoding 的类将使用 encodeWithCoder: 和 initWithCoder: (至少我直到最近才这么认为)按预期工作,而开发人员不必担心例程内部发生的事情(除非我对一个符合 NSCoding 的类的想法完全搞砸了!)

UIImageView 类是 NSCoding 兼容的。所以我不必担心如何使用 NSKeyedArchiver 和 NSKeyedUnarchiver 类对其进行序列化/反序列化。但是每次我尝试对 UIImageView 对象进行编码时,都会收到 UIImage 无法识别 encodeWithCoder: 方法的错误。

现在 UIImageView 在内部使用 UIImage 对象。但是编码不应该自己解决这个问题吗?

还是文档中指定的 NSCoding 合规性只是让用户知道他们可以实现 initWithCoder 和 encodeWithCoder 方法?

有人可以为我澄清一下吗!我彻底糊涂了!

4

2 回答 2

33

该文档具有误导性-与您所说的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
于 2009-07-02T13:58:30.787 回答
8

这个问题值得更新,因为 iOS 5.1 为 UIImage 添加了 NSCoding 功能,并且 Nathan de Vries 的回答现在会导致最新编译器的警告。

如果您的应用支持 5.1 之前的 iOS,此问题提供了解决该问题的解决方案。它与 Nathan 建议的基本相同,但检查该方法是否已经存在,而不是对其进行硬编码。

于 2012-06-14T20:53:48.150 回答