过去几个月我一直在开发iPhone应用程序。最近我想提升性能并缓存UI中使用的一些图像。用户从网上随机下载图像,因此我无法将特定图像添加到项目中。我也已经在使用NSUserDefaults在应用程序中保存其他信息。
所以现在我正在尝试将UIImages的字典保存到我的NSUserDefaults对象并获得......
- [UIImage encodeWithCoder:]:无法识别的选择器发送到实例
然后我决定使用名为UISaveableImage的类继承UIImage并实现NSCoding。所以我现在......
@implementation UISaveableImage
-(void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:super forKey:@"image"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
if (self=[super init]){
super = [decoder decodeObjectForKey:@"image"];
}
return self;
}
@end
这并不比我开始时更好。如果我能够将UIImage转换为NSData我会很好,但我能找到的功能就像UIImagePNGRepresentation,它要求我知道这是什么类型的图像。 UIImage不允许我做的事情。思考?我觉得我可能走错了路......
答案 0 :(得分:6)
您不希望在NSUserDefaults中存储图像。它们是大量数据,NSUserDefaults存储为plist;你想写一小部分信息。
您应该将图像写入磁盘,然后将文件名存储为默认值:
NSString *filename = myImageFilename;
[UIImagePNGRepresentation(image) writeToFile: myImageFilename atomically];
[[NSUserDefaults standardDefaults] setObject: myImageFilename forKey: @"lastImageFilename"];
答案 1 :(得分:1)
一年之后磕磕绊绊。我想添加(以防其他人在这里偶然发现)你应该将图像存储在缓存目录中,并避免iTunes尝试备份它们。
- (NSString *)pathForSearchPath:(NSSearchPathDirectory)searchPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(searchPath, NSUserDomainMask, YES);
NSString *directoryPath = [paths objectAtIndex:0];
return directoryPath;
}
- (NSString *)cacheDirectoryPath {
return [self pathForSearchPath:NSCachesDirectory];
}