从服务器下载和保存大量图像时出现 iOS 内存问题 (ARC)

2023-12-23

以下代码从服务器下载 700 多个不同大小的图像,这里的问题是内存(即使使用 ARC)永远不会释放,最终会出现内存警告,然后应用程序退出。我已经在这个方法中尝试过@autoreleasepool,但似乎不起作用。另外,我尝试在不同位置停止 for 循环,以查看完成后内存是否被释放,但事实并非如此。

此方法在 for 循环内调用并接收图像 url 和短名称。它已在后台线程和主线程中尝试过,具有相同的结果(内存方面)。

-(void)saveImage:(NSString*)image name:(NSString*)imageName{     
    int k = 0;
    for (int j = 0; j < [imageName length]; j++) {
        if ([imageName characterAtIndex:j] == '/') {
            k = j;
        }
    }if (k != 0) {
        imageName = [imageName substringFromIndex:k+1];
    }    

    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", imageName]]; 

    if ([fileManager fileExistsAtPath:fullPath]) {
        [fileManager removeItemAtPath:fullPath error:nil];
    }

    NSURL *url = [NSURL URLWithString:image];
    NSData *data = [[NSData alloc]initWithContentsOfURL:url];
    NSLog(@"Saved: %d:%@", [fileManager createFileAtPath:fullPath contents:data attributes:nil], url); 
    data = nil;
}  


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

int cacheSizeMemory = 4*1024*1024; // 4MB
int cacheSizeDisk = 32*1024*1024; // 32MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.window makeKeyAndVisible];
return YES;
}

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"mem warning, clearing cache");
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}

根据您的屏幕截图,我认为问题出在 NSURL 缓存而不是实际的 NSData 对象上。您可以尝试以下操作:

在您的应用程序委托中,设置初始 URL 缓存:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Do initial setup
    int cacheSizeMemory = 16*1024*1024; // 16MB
    int cacheSizeDisk = 32*1024*1024; // 32MB
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

    // Finish the rest of your didFinishLaunchingWithOptions and head into the app proper
}

将以下内容添加到您的应用程序委托中:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}

将创建一个缓存文件:"Library/Caches/your_app_id/nsurlcache"

Apple 示例的链接如下:网址缓存 https://developer.apple.com/library/ios/#samplecode/URLCache/Introduction/Intro.html

代码未经过测试,但这(或类似的东西)应该可以解决您的问题+此外您可以尝试缓存大小。

您可以发布另一个使用此代码进行分配的屏幕截图吗?我预计内存使用量会停止增长并趋于平稳。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从服务器下载和保存大量图像时出现 iOS 内存问题 (ARC) 的相关文章

随机推荐

  • Java 线程:解释正在运行的 JVM 的线程状态

    Java 线程始终处于以下十种状态之一 NEW Just starting up i e in process of being initialized NEW TRANS Corresponding transition state no
  • 从 mp3/ogg 中剪切精确的时间范围

    我在 CDN 上有一堆音频文件 这些是并行的 mp3 和 ogg vorbises 这些文件每个都值得播放大约一小时 我需要从这些文件中提取任意部分 我得到一个文件名 我可以选择是否使用 mp3 或 ogg 版本 和两个时间戳 并且我需要恰
  • 计算iTextSharp PDF文档的高度?

    使用iTextSharp时如何计算PDF文档的高度 我正在使用 iTextSharp 使用绝对位置在 PDF 文档上定位各种图像 不过我注意到了SetAbsolutePosition 定位Y参数来自底部 所以我需要计算高度才能执行以下操作
  • MongoDB MapReduce是否锁定数据库

    MongoDB MapReduce 作业是否会锁定数据库 我正在开发一个多用户 MongoDB Web 应用程序 并且担心多用户冲突和性能 有人能给我一些至理名言吗 简单的回答 有时 这在很大程度上取决于您如何使用map reduce 但根
  • Electron:删除 beforeunload 事件监听器

    我有一个电子应用程序 用于显示我无法控制的网页 该应用程序的使用是为了每隔几秒钟就可以显示一个不同的页面 显示的页面之一附加了一个 beforeunload 监听器 如下所示 window addEventListener beforeun
  • 如何获取winexec或shellexecute中执行的Handle?

    我用来创建像 winexec Hand 这样的自定义函数 它将返回执行的应用程序的句柄 我确实使用了 findwindow 但如果它更改窗口标题就会出现问题 没有一种通用方法可以获取应用程序的 该 窗口句柄 因为不能保证任何程序都有一个窗口
  • 在 v23 上找不到符号 Manifest.permission.WRITE_EXTERNAL_STORAGE

    我使用以下 build gradle 文件编译代码 android compileSdkVersion 23 buildToolsVersion 23 0 1 defaultConfig applicationId com example
  • 作曲家权限被拒绝(公钥)

    我在 BitBucket 上有一个私人存储库 我尝试使用composer install在本地主机上安装 这是我的composer json文件 repositories type git url email protected cdn c
  • 初始化函数的目的

    我经常看到构造函数只调用 init 函数 如果您可以将 init 函数的内容放入构造函数中 为什么还要使用 init 函数呢 每个实例仅调用对象的构造函数一次 而 init 函数可能会调用多次 考虑以下代码 public class Foo
  • 使用 JLayeredPane 将多个 JPanel 添加到一个 JPanel 中

    我正在尝试将多个面板添加到另一个面板 我希望它们位于彼此之上 因此我使用 JLayeredPane 我为每个按钮添加了一个按钮 工作时应该出现两个按钮 import java awt Color import javax swing JBu
  • 如果UDF公式失败,Excel VBA保留原始值

    在各个单元格中 我有一个引用 UDF 的指定公式 getValueFromWorkbook OtherWorkbook 10 The getValueFromWorkbookUDF 大致做了类似的事情 Function getValueFr
  • 子域重定向到另一台服务器

    我有一个通过共享托管计划托管的网站 我的域名是在GoDaddy注册的 域名服务器是我的共享主机的域名服务器 到目前为止 一切正常 但我试图弄清楚如何添加子域并将其指向其他地方 我想将 sub mydomain com 指向其他一些 IP 在
  • 与 .pub 文件的 SSH 连接

    我从客户那里得到了 id rsa pub 我被告知要连接到它 我尝试添加密钥ssh copy id email protected cdn cgi l email protection 但它给出了错误 Permission denied p
  • 按语法解析为 AST(或 .y+.lang => xml)的工具

    给定一个词法分析器定义文件 一个语法文件 例如 postgresql y lflex 和 bison 程序来自它的源树 以及由这些词法分析器和解析器定义的文件 例如 SQL 查询 以某种标准形式 例如 XML 的 JSON 获取 AST 该
  • 提取 XSLT 中单引号之间的文本

    需要在之后提取文本单引号 E g div show div 变量是这样的
  • 使用 .gitignore 忽略 node_modules

    我使用 npm 启动了一个项目 添加了一些依赖项 然后使用ignit初始化了存储库git init 我想要目录node modules被git忽略 所以我将它添加到 gitignore像这样文件 gitignore node modules
  • 如何更新它以使用最新版本的引导程序?

    我对中演示的功能感兴趣这把小提琴 http jsfiddle net hcL4s 用于显示模式对话框 敲除结合是 Custom binding for making modals ko bindingHandlers bootstrapMo
  • 什么是 C++ 模块权限?

    我在 C 模块的上下文中看到了一些对术语 权限 的引用 例如https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules Baz Baz s declaratio
  • Android - 我似乎没有 ANIM 文件夹或 MAINANIM.xml 文档...这是为什么?

    无论我在 res 目录中查找什么 都只有 main xml 并且我应该有 res anim mainanim xml 但我没有它 我的代码在这里 逐帧动画 https stackoverflow com questions 3290290
  • 从服务器下载和保存大量图像时出现 iOS 内存问题 (ARC)

    以下代码从服务器下载 700 多个不同大小的图像 这里的问题是内存 即使使用 ARC 永远不会释放 最终会出现内存警告 然后应用程序退出 我已经在这个方法中尝试过 autoreleasepool 但似乎不起作用 另外 我尝试在不同位置停止