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>
不是问题,因为NSSecureCoding
inheritanceNSCoding
。
无论如何,我确认问题可以通过以下代码进行转载:
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
引入的imageAsset
或traitCollection
属性有关