ARC 已启用,但存在内存泄漏(目标 C)

2023-12-02

正如您所看到的,下面的代码除了枚举一组文件之外并没有做太多事情(全部注释掉),但是,在运行下面的函数 40 秒后,我的内存使用量增长到超过 2 GB,该函数是通过按用户界面上的按钮。

我可以运行 UI 几个小时,在按下按钮之前,内存使用量不超过 8MB。

假设 ARC 已打开,那么内存中保留着什么?

removed original code as the edit below made no differance.

EDIT:

尝试过@autoreleasepool{ dispatch_asyny ... }以及 while 周围和 while 循环内部的排列,但没有效果。

这是添加并清理了 autorelasepool 的代码

-(void) search{

    self.dict = [[NSMutableDictionary alloc] init];
    NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/SeaWall.log"];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSString *bundleRoot = @"/";
        NSFileManager *manager = [NSFileManager defaultManager];
        NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot];
        NSString *filename;

        while ((filename =  [NSString stringWithFormat:@"/%@", [direnum nextObject]] ) && !self.exit) {
            @autoreleasepool {

                NSString *ext = filename.pathExtension;

                if ([ext hasSuffix:@"so"] || [ext hasSuffix:@"dylib"] ) {
                    if (filename == nil || [NSURL URLWithString:filename] == nil) {
                        continue;
                    }

                    NSData *nsData = [NSData dataWithContentsOfFile:filename];
                    if (nsData != nil){
                        NSString *str = [nsData MD5];
                        nsData = nil;

                        [self writeToLogFile:[NSString stringWithFormat:@"%@ - %@", [filename lastPathComponent], str]];

                    }
                }
                ext = nil;
            } // end autoreleasepool
        }
        [fileHandle closeFile];
        [self ControlButtonAction:nil];


    });
}

Memory Usage


内存并不完全泄漏:它已经准备好被释放,但它永远没有机会被释放。

ARC 建立在 Objective-C 的手动内存管理规则之上。基本规则是“调用的对象/函数init拥有新实例”,并且所有者必须release当对象不再需要它时。

对于创建对象的便捷方法来说这是一个问题,例如[NSData dataWithContentsOfFile:]。该规则意味着NSData类拥有该实例,因为它调用了init在上面。一旦返回该值,该类将不再需要该对象,并且需要释放它。但是,如果这种情况发生在被调用者有机会保留实例之前,则该实例将在任何事情发生之前就消失。

为了解决这个问题,Cocoa 引入了autorelease方法。此方法将对象的所有权转移到最后设置的自动释放池。当您退出自动释放池的作用域时,自动释放池将被“耗尽”。

Cocoa/AppKit/UIKit 会自动围绕事件处理程序设置自动释放池,因此您通常不需要担心这一点。但是,如果您有一个长时间运行的方法,这就会成为一个问题。

您可以使用以下方式声明自动释放池@autoreleasepool陈述:

@autoreleasepool
{
    // code here
}

在右括号中,自动释放池收集的对象被释放(如果没有其他人引用它们,则可能会释放它们)。

因此,您需要将循环体包含在该语句中。

这是一个例子。这段代码在我的计算机上每秒“泄漏”大约 10 MB,因为执行过程永远不会离开@autoreleasepool scope:

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        while (true)
        {
            NSString* path = [NSString stringWithFormat:@"%s", argv[0]];
            [NSData dataWithContentsOfFile:path];
        }
    }
}

另一方面,这样一来,内存使用量就会保持稳定,因为执行会留下@autoreleasepool每次循环迭代结束时的范围:

int main(int argc, const char * argv[])
{
    while (true)
    {
        @autoreleasepool
        {
            NSString* path = [NSString stringWithFormat:@"%s", argv[0]];
            [NSData dataWithContentsOfFile:path];
        }
    }
}

对于长循环来说,在循环条件中创建对象很尴尬,因为这些对象不会被内部拾取。@autoreleasepool。您需要将这些放入@autoreleasepool范围也是如此。

返回

每当我们return一个对象(也许是Swift),我们需要注册到最近的@autoreleasepool阻止(通过调用autorelease防止内存泄漏的方法,根据所有权规则),但如今ARC自动为我们做这件事;

每当ARC残疾人;使用后alloc and/or init, call autorelease手动,例如:

- (NSString *)fullName {
    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
                                          self.firstName, self.lastName] autorelease];
    return string;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARC 已启用,但存在内存泄漏(目标 C) 的相关文章

  • 导出 iPhone 地址簿数据库的可能方法

    我想将 Phone s Address Book sqlite db 导出到我的 iPhone 应用程序中 我在网上搜索过 但一切似乎都在 ABAddressBook 上迭代 但我想知道是否可以以编程方式将 Phone s Address
  • 使用 Objective-C 将 HTML 文本转换为纯文本

    我有巨大的NSString里面有 HTML 文本 该字符串的长度超过 3 500 000 个字符 我怎样才能将此 HTML 文本转换为NSString里面有纯文本 我正在使用扫描仪 但它运行速度太慢 任何想法 这取决于您的目标 iOS 版本
  • for 循环内存不足

    嘿 所以我认为如果我制作一个生成随机密码的小应用程序 然后让该应用程序运行所有可能性并尝试查看密码是什么 告诉我它尝试了多少次 那会很酷 有时应用程序可以工作 有时会崩溃 具体取决于密码是什么 我想知道是否可以采取任何措施来防止它因占用大量
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • 带 ModalPresentationStyle 的弹出框在 iOS 7 iPad 中不居中

    我在使用 iOS 7 时遇到了一个问题 这似乎是一个错误 或者只是我没有做正确的事情 我有 modalViewController 它在 iPad 上以 ModalPresentationStyle 的形式显示为弹出窗口 而且它不是标准尺寸
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • UITableview 中的水平和垂直滚动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I want to make a lineup for a festival You can see what I want to a
  • 是否有针对不同屏幕尺寸的单独故事板?

    基本上我已经完成了一个应用程序 我唯一的问题是 ATM 机应用程序在设计时只考虑了 4 英寸显示屏 当在 3 5 英寸模拟器上运行时 应用程序会丢失 0 5 英寸 显然 那么我的问题是 如何在 Xcode 5 中为不同的屏幕尺寸设置不同的故
  • 如何使用 iPhone SDK 实现可滑动的图像堆栈(例如照片应用程序)?

    我想获取一堆图像 或者可能是一组用于下载图像的 URL 并以全屏方式显示它们 一次一个 使用 iPhone SDK 使用用户滑动来平滑地为堆栈中的下一个图像设置动画 Apple 的 Photo app 似乎可以做到这一点 此外 如果尚未检索
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • 在 iOS 上将 NSString 转换为 NSDate 的正确方法?

    我一直在使用此方法将常规 NSString 对象转换为 NSDate 但尝试向 Apple 提交更新 但遭到拒绝 在 iOS 中还有什么其他方法可以做到这一点 NSString date str 2011 08 12T12 20 00Z N
  • 覆盖层不与 UITableView 一起滚动 - iOS

    我有一个 UITableView 类 它使用以下方法在转到下一个屏幕时调用加载覆盖 问题是这个加载屏幕不随列表滚动 所以如果你滚动一点并单击某些东西 加载屏幕不会显示 因为它位于顶部 如何让加载屏幕始终保持在 UITableView 的顶部
  • UIPanGestureRecognizer 对坐标的限制

    我在主 UIView 中添加了一个子视图 称为panel 并且我向其中添加了gestureRecognizer 因为我希望它只能在Y轴上拖动并且只能在某些限制下 即160 300 超过300它不能拖动 我以这种方式实现了手势处理 IBAct
  • PFQueryTableViewController 错误

    我正在遵循在线教程 使用 Parse 作为后端创建照片共享应用程序 我已经运行了两次教程 两次都从头开始创建应用程序 但在同一位置仍然出现相同的错误 我到处寻找解决方案 但仍然没有运气 我正在使用 PFQueryTableViewContr
  • 有什么方法可以询问方法的名称吗?

    我正在尝试调试我正在开发的 iPhone 应用程序 向各种源文件添加 50 条 NSLog 语句的想法让我感到很兴奋 我想做的是写一对陈述 比如 NSString methodName self methodName NSLog metho
  • 使用 UITabBarController 时覆盖整个屏幕的视图?

    我想在 UITabBarController 设置中在整个屏幕上覆盖 HUD 样式的透明图形 执行此操作的按钮位于第一个选项卡的屏幕 FirstViewController 中 并且覆盖层也应该覆盖选项卡 这可能吗 您可以将新视图直接附加到
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void

随机推荐

  • 将图像保存到文档目录并检索电子邮件附件

    我无法弄清楚NSBundle DocumentDirectory数据 我有一张相机图片 图像视图 我正在保存到NSDocumentDirectoy然后想要检索它以附加到电子邮件中 这里是保存代码 IBAction saveImage NSA
  • C++ 将方法指针作为模板参数传递

    我有一个这样的调用者函数 template
  • 如何在 CentOS 6 上安装 ffmpeg

    我已经尝试安装 ffmpeg 2 天了 但没有成功 我在 youtube 上尝试了无数视频 在 google 上一步步尝试 但没有成功 任何帮助都会很棒 我有一台 Centos 6 服务器 是的 我在 mac 终端中使用 root ssh
  • PHP 格式日期

    如何强制输出日期格式 2012年12月12日 2012年1月10日 2012年1月5日 代替 12 12 2012 01 10 2012 01 05 2012 我的代码如下 adatefrom date create POST datefr
  • apache 日志中的 wkhtmltopdf 错误

    exec wkhtmltopdf test html output pdf 在 php 命令行中它可以工作 但是如果我尝试从 apache 调用它 它不会创建 pdf 文件并且日志显示 tail f var log apache2 erro
  • 标记上的语法错误、lambda 表达式的构造错误

    我在用于线程的以下代码中遇到了语法问题 btnNewButton addActionListener new ActionListener public void actionPerformed ActionEvent e new Thre
  • 友谊和继承有什么区别?

    假设有两个类A和B class A class B 下面的两个例子在哪些方面有所不同 示例1 class C public A public B 示例2 class C private friend class A friend class
  • 如何使用 pandas.Series.str.contains 搜索字符加上

    如何在 pandas 数据框列中使用 pandas Series str contains 搜索字符 我试过 df noplus df df column1 str contains case False 它给了我一个错误 File hom
  • 如何使用 python 为 ds:DigestValue、ds:SignatureValue 和 ds:X509Certificate 生成 Base64 哈希值?

    我需要生成并签署 XML 我使用的是 Windows 10 我有 PFX 格式的证书 也称为 P12 我已成功从该文件中提取密钥和证书 以便对 XML 进行签名 但现在我需要知道如何签署该 XML 更准确地说 如何生成此 XMl 元素的内容
  • JBoss AS 7:如何独立部署EJB和依赖WAR?

    我有一个带有一个 EJB 的应用程序 mwf ejb jar 和战争 mwf web war 如果我将它们打包在同一个 EAR 中 则一切正常 有没有办法先部署EJB 然后部署WAR 如果我尝试一下 我的 EJB JAR 部署得很好 但是当
  • 根据第一个和最后一个逗号分割字符串

    我想在第一个和最后一个逗号上分割字符串 每个字符串至少有两个 逗号 以下是示例数据集和所需的结果 这里有一个类似的问题询问如何在第一个逗号上拆分 在字符串中的第一个逗号处拆分 这里我问如何在前两个冒号上分割字符串 在前两个冒号上分割字符串
  • 错误 您的帐户已具有有效的 iOS 分发证书

    我见过其他存在此类错误的问题 但没有一个问题可以帮助我解决我的问题 我有我的个人苹果开发者帐户和我工作的公司的一个帐户 当我尝试为我的公司提交应用程序以对其进行 Beta 测试时 出现错误 您的帐户已经拥有有效的 iOS 分发证书 我尝试再
  • java手机通用签名工具

    谁能告诉我几乎所有java移动供应商 如三星 索尼 诺基亚 Micromax Moto等 使用的常用签名工具是什么 AFAIK Thawte Verisign and Java验证支持大多数设备 但一切都是成本 有一次我为此与 Thawte
  • Python + Django 页面重定向

    如何完成简单的重定向 例如cflocation在 ColdFusion 中 或header location http 对于 PHP 在 Django 中 这很简单 from django http import HttpResponseR
  • 寻找最佳报价组合的算法,该组合可以为给定的一组商品提供最大折扣

    我有带有 ID 的物品 1001 1002 1003 1004 1005 1006 There respective quantities are 2 5 1 1 5 2 现在我有如下数据 每行都有一个 OfferId offerId It
  • PHP 中如何将日期转换为时间戳?

    我如何从例如获取时间戳22 09 2008 此方法适用于bothWindows 和 Unixand is 时区意识到 如果你和你一起工作 这可能就是你想要的dates 如果您不关心时区 或者想使用服务器使用的时区 d DateTime cr
  • 如何使用 bookshelf-pagemaker 添加简单的Where子句

    使用书架页面制作器NodeJS 模块 https www npmjs com package bookshelf pagemaker https github com bhoriuchi bookshelf pagemaker 我能够获得基
  • 如何在Opengl中裁剪网格的这一部分?

    I tried to clip mesh in openGl and i think that i have a problem with math I have a cube 例如 我需要剪辑该立方体的一半 所以我不明白如何计算这个裁剪平
  • Angular 2 中同一根应用程序的多个实例

    我们将 Angular 2 集成到旧页面中 使功能逐渐变得更加用户友好 到目前为止 将预渲染的后端小部件替换为角度模块效果非常好 然而 我遇到了一个我不知道如何解决的问题 我编写了一个模块 组件 它可以在页面上的不同位置和不同的配置中多次出
  • ARC 已启用,但存在内存泄漏(目标 C)

    正如您所看到的 下面的代码除了枚举一组文件之外并没有做太多事情 全部注释掉 但是 在运行下面的函数 40 秒后 我的内存使用量增长到超过 2 GB 该函数是通过按用户界面上的按钮 我可以运行 UI 几个小时 在按下按钮之前 内存使用量不超过