NSKeyedArchiverを使用してエンコードおよびデコードしようとすると、このコードスニペットのUIImageが元の状態に復元されないのはなぜですか?なぜUIImageは正常にデコードされませんか?
"decodedImage"にはデコード後に画像が含まれると予想されますが、代わりにNULLにすぎません。
// Any image here seems to repro the issue
UIImage *image = [UIImage imageNamed:@"soda.jpg"];
// This prints YES (1), just a sanity check.
NSLog(@"Confirms %d", [[UIImage class] conformsToProtocol:@protocol(NSCoding)]);
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *coder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[coder encodeObject:image forKey:@"image"];
[coder finishEncoding];
// I would expect this to be large, instead it's < 1kb.
NSLog(@"Data length is: %zu", (unsigned long)data.length);
NSKeyedUnarchiver *decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
// This prints YES (1)
NSLog(@"containsValueForKey returns %d", [decoder containsValueForKey:@"image"]);
// decodedImage is NULL here, even though containsValueForKey returned YES
UIImage *decodedImage = [decoder decodeObjectForKey:@"image"];
[decoder finishDecoding];
この場合、UIImageをNSDataに変換してエンコードするなどの回避策はありません。その理由は、このようなものを使用する無関係なコードを再現しようとしており、理解しようとしているからです。
イメージはnsdataから最初にイメージをラウンドトリップしてuiimageに戻すと、コードは正常に動作します。なぜですか?
UIImage *originalImage = [UIImage imageNamed:@"soda.jpg"];
NSData *imageData = UIImagePNGRepresentation(originalImage);
UIImage *image = [UIImage imageWithData:imageData];
この奇妙なことは、[UIImage imageNamed:]を使って作成したUIImageが、他のUIImageと同じ方法でシリアル化していないということです。おそらく、イメージがアプリケーションバンドルから来たことを知っているからです... –