Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保存和加载图片的正确方法_Ios_Objective C_Cocoa Touch_Uiimage - Fatal编程技术网

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。