Unarchive UIImage对象在iOS 8上使用NSKeyedUnarchiver返回CGSizeZero图像

我有这个代码在iOS 7上工作:

NSData *imageData = [NSKeyedArchiver archivedDataWithRootObject:self.imageView.image]; UIImage *imageCopy = [NSKeyedUnarchiver unarchiveObjectWithData:imageData]; NSLog(@"%@",NSStringFromCGSize(imageCopy.size)); 

但在iOS 8上, imageCopy的大小始终为零。 同样的事情发生在我归档UIImageView ,未归档的imageView的图像的大小为零。 我发现在iOS 7中, UIImage头是这样的:

 UIImage : NSObject <NSSecureCoding, NSCoding> 

但在iOS 8上是这样的:

 UIImage : NSObject <NSSecureCoding> 

它看起来像iOS 8上的NSCoding协议是缺less的。我必须编码实际的图像数据: UIImagePNGRepresentation(self.imageView.image)而不是图像,以确保我得到一个很好的图像回来。

有谁知道为什么发生这种情况? 是否向后兼容? 我注意到在iOS早期版本UIImage不符合NSCoding

UIImage : NSObject <NSSecureCoding>不是问题,因为NSSecureCodinginheritanceNSCoding

无论如何,我确认问题可以通过以下代码进行转载:

 UIImage *img = [UIImage imageNamed: @"myImage"]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img]; UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> (null), {0, 0} 

另一方面,下面的代码按预期工作:

 UIImage *img = [UIImage imageNamed: @"myImage"]; UIImage *img2 = [UIImage imageWithCGImage:img.CGImage scale:img.scale orientation:img.imageOrientation]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img2]; UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> <UIImage: 0x7fa013e766f0>, {50, 53} 

我不知道为什么,也许错误?

我认为,这与traitCollection引入的imageAssettraitCollection属性有关