Ios 保存和加载图片的正确方法
我正在制作一个小应用程序,用户可以在其中创建一个游戏配置文件,输入一些数据和一张可以用相机拍摄的照片 我在Ios 保存和加载图片的正确方法,ios,objective-c,cocoa-touch,uiimage,Ios,Objective C,Cocoa Touch,Uiimage,我正在制作一个小应用程序,用户可以在其中创建一个游戏配置文件,输入一些数据和一张可以用相机拍摄的照片 我在NSUserDefaults的帮助下保存了大部分配置文件数据,但一位朋友不鼓励我将配置文件图像保存在NSUserDefault中 在我的应用程序中本地保存和检索图像的正确方法是什么。不要将blob保存到属性列表,例如NSUserDefaults。在您的情况下,我将直接写入磁盘。一种方法是使用应用程序的文档目录。这是特定于某个应用程序的,其他应用程序将看不到它。 如何创建此: 只需向App D
NSUserDefaults
的帮助下保存了大部分配置文件数据,但一位朋友不鼓励我将配置文件图像保存在NSUserDefault
中
在我的应用程序中本地保存和检索图像的正确方法是什么。不要将blob保存到属性列表,例如NSUserDefaults。在您的情况下,我将直接写入磁盘。一种方法是使用应用程序的文档目录。这是特定于某个应用程序的,其他应用程序将看不到它。
如何创建此:
只需向App Delegate添加一个静态函数,并在需要路径的地方使用该函数。
- (NSString )applicationDocumentDirectory {
/
Returns the path to the application's documents directory.
*/
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}
-(NSString)应用程序文档目录{
/
返回应用程序文档目录的路径。
*/
NSArray*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSString*basePath=([paths count]>0)?[paths objectAtIndex:0]:无;
返回基本路径;
}
希望对您有所帮助。您应该将其保存在文档
或缓存
文件夹中。下面是如何做到这一点
保存到文档
文件夹:
NSString* path = [NSHomeDirectory() stringByAppendingString:@"/Documents/myImage.png"];
BOOL ok = [[NSFileManager defaultManager] createFileAtPath:path
contents:nil attributes:nil];
if (!ok)
{
NSLog(@"Error creating file %@", path);
}
else
{
NSFileHandle* myFileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
[myFileHandle writeData:UIImagePNGRepresentation(yourImage)];
[myFileHandle closeFile];
}
NSFileHandle* myFileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
UIImage* loadedImage = [UIImage imageWithData:[myFileHandle readDataToEndOfFile]];
从文档
文件夹加载:
NSString* path = [NSHomeDirectory() stringByAppendingString:@"/Documents/myImage.png"];
BOOL ok = [[NSFileManager defaultManager] createFileAtPath:path
contents:nil attributes:nil];
if (!ok)
{
NSLog(@"Error creating file %@", path);
}
else
{
NSFileHandle* myFileHandle = [NSFileHandle fileHandleForWritingAtPath:path];
[myFileHandle writeData:UIImagePNGRepresentation(yourImage)];
[myFileHandle closeFile];
}
NSFileHandle* myFileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
UIImage* loadedImage = [UIImage imageWithData:[myFileHandle readDataToEndOfFile]];
您还可以使用uiimagejpeg表示法
将UIImage
保存为JPEG
文件。此外,如果要将其保存在缓存
目录中,请使用:
[NSHomeDirectory() stringByAppendingString:@"/Library/Caches/"]
不要使用[nshomeditory()stringByAppendingString:…]
。将[[NSSearchPathForDirectoriesInDomains(…,NSUserDomainMask,YES)objectAtIndex:0]
与NSDocumentDirectory
或NSCachesDirectory
一起使用。为什么不应使用[NSHomeDirectory()stringByAppendingString:…]
?你能解释一下吗?@José和Rafal:NSSearchPathForDirectoriesInDomains
更好,因为如果苹果决定更改目录结构,它不会中断。一般来说,你需要的硬编码越少越好。如果你想做的事情存在特定的API函数,就使用它。获取此路径的干净方法是:NSString*dir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];NSString*path=[NSString pathWithComponents:[NSArray arrayWithObjects:dir,@“myImage.png”,nil];
(可惜太冗长了!)哎呀,我刚刚找到了一个更好的方法来表达我的例子中的第二条语句:NSString*path=[dir-stringByAppendingPathComponent:@“myImage.png”];
@reecon确实你找不到文档中写的所有内容。我所做的语句基于一些分析结果(使用Xcode工具)。另外,我并不是说调用一次、两次或更多一点时会占用大量内存,而是说,每次加载tableview单元格时都尝试调用它。它最终会显示一些分配峰值。在我的例子中,它会达到300 Mb,我已设法将其减少到几Kb。