是否可以使用NSKeyedArchiver存储动画UIImage?

时间:2016-02-08 02:13:10

标签: ios objective-c uiimage nsarchiving

我使用从网络服务器下载的帧加载了图像。

NSArray* frames = [self fetchFramesFromServer];
imageView.image = [UIImage animatedImageWithImages:frames duration:1.0];

每当我尝试归档这些帧时,编码函数都会返回NO:

BOOL success = [NSKeyedArchiver archiveRootObject:(frames) toFile:archivePath];

每当我尝试存档图像时,编码功能也会返回NO:

BOOL success = [NSKeyedArchiver archiveRootObject:(imageView.image) toFile:archivePath];

这是否可能,或者我是否遗漏了一些需要从包中加载UIImage,png格式或非动画的archiveRootObject?

仅供参考,在调试器中打印出来的archivePath是

NSPathStore2 * @"/var/mobile/Containers/Data/Application/E475E3C1-4E3F-43D6-AD66-0F98320CF279/Library/Private Documents/assets/a/b/c.archive"   0x000000012c555a60

更新:

我将动画的各个帧存储在for循环中,但我得到以下内容:

+ (void) saveImage:(UIImage*)inputImage
    withSuffix:(NSString*)fileSuffix
{
if (inputImage == nil) {
    NSLog(@"ERROR: input image is nil!");
    return;
}

// strip away intermediate folders to avoid over-nesting
// ex: __F1/MF/FR/1_MF_FR_Animation_a1.png
// ===> 1_MF_FR_Animation_a1.png
NSString* suffixStub = [MyDatabase stubOfFilepath:fileSuffix];

NSURL* url = [MyDatabase folderURL];
NSURL* imageURL = [url URLByAppendingPathComponent:suffixStub];

NSData* pngData = UIImagePNGRepresentation(inputImage);
[NSKeyedArchiver archiveRootObject:pngData toFile:imageURL.path];
pngData = nil;

NSLog(@"Image %@ successfully saved!", fileSuffix);
} 

但是在NSKeyedArchiver线上,我得到" malloc:***错误对象0x178202340:释放未分配的指针"

1 个答案:

答案 0 :(得分:0)

首先将图像转换为NSData,然后尝试存档

NSData* data = UIImagePNGRepresentation(imageView.image);
BOOL success = [NSKeyedArchiver archiveRootObject:data toFile:archivePath];

如果是NSArray,只有当数组的所有对象符合NSCoding协议时,才可以进行归档。如果您的数组包含自定义对象,请参阅Custom object archiving,了解如何符合NSCoding

<强>更新

如果数组的对象是CGRect类型的框架,您可以使用NSStringFromCGRect()CGRectFromString()来存储然后检索它们。