我正在尝试将图像数组保存到文档文件夹中。我设法将图像保存为NSData并使用下面的方法检索它,但保存数组似乎超出了我。我看了几个其他相关的问题,似乎我做的一切都是正确的。
将图像添加为NSData并保存图像:
[imgsData addObject:UIImageJPEGRepresentation(img, 1.0)];
[imgsData writeToFile:dataFilePath atomically:YES];
检索数据:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"imgs.dat"];
[self setDataFilePath:path];
NSFileManager *fileManager = [NSFileManager defaultManager];
if([fileManager fileExistsAtPath:dataFilePath])
imgsData = [[NSMutableArray alloc] initWithContentsOfFile:dataFilePath];
因此,使用上述工作将图像写为NSData,而不是NSData的图像数组。它在数组中,但它有0个对象,这是不正确的,因为我保存的数组有几个。有没有人有任何想法?
答案 0 :(得分:8)
首先,你应该刷新Cocoa Memory Management,第一行代码有点担心。
对于数据序列化,您可能想要使用NSPropertyListSerialization
。此类序列化数组,字典,字符串,日期,数字和数据对象。与initWithContentsOfFile:
方法不同,它有一个错误报告系统。方法名称和参数有点长,以适应一行,因此有时您可能会看到它们用Eastern Polish Christmas Tree表示法编写。要保存imgsData
对象,您可以使用:
NSString *errString;
NSData *serialized =
[NSPropertyListSerialization dataFromPropertyList:imgsData
format:NSPropertyListBinaryFormat_v1_0
errorDescription:&errString];
[serialized writeToFile:dataFilePath atomically:YES];
if (errString)
{
NSLog(@"%@" errString);
[errString release]; // exception to the rules
}
要重新阅读,请使用
NSString *errString;
NSData *serialized = [NSData dataWithContentsOfFile:dataFilePath];
// we provide NULL for format because we really don't care what format it is.
// or, if you do, provide the address of an NSPropertyListFormat type.
imgsData =
[NSPropertyListSerialization propertyListFromData:serialized
mutabilityOption:NSPropertyListMutableContainers
format:NULL
errorDescription:&errString];
if (errString)
{
NSLog(@"%@" errString);
[errString release]; // exception to the rules
}
检查errString
的内容以确定出错的地方。请记住,这两种方法已被弃用,支持dataWithPropertyList:format:options:error:
和propertyListWithData:options:format:error:
方法,但这些方法是在Mac OS X 10.6中添加的(我不确定它们是否可在iOS上使用)