UIWebView 没有释放内存

2023-12-03

我在尝试恢复分配给 a 的内存时遇到了一些真正的麻烦UIWebView在我的应用程序中。我本质上是创造并呈现UIWebView暂时为用户单独ViewController,然后删除所有引用并弹出ViewController从堆栈中。尽管做了所有这些,分配的内存永远不会返回,并且我被额外的 10 Mb 内存卡住了每一次我接着说ViewController again.

让我们看看我是如何处理这个问题的UIWebView无论如何。

好吧,对于初学者来说,我的头文件中有一个对它的本地引用,请在此处显示

#pragma mark UIWebView Properties
/// WebView for loading URL resources
@property (nonatomic, weak)UIWebView *webView;

请注意,这不是一个IBOutlet,我正在创建这个UIWebView以编程方式在以下方法中触发ViewDidAppear.

-(void)presentYoutubeVideoWithID:(NSString *)videoID {
    /* Setup UIWebView */
    UIWebView *webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    /* Set Delegate */
    [webView setDelegate:self];
    /* Set local property */
    [self setWebView:webView];
    /* Add view to ViewController */
    [self.view addSubview:webView];
    /* Set constraints */
    // Removed for simplicity 

    /* Set URL */
    NSString *youTubeVideoHTML = @"<!DOCTYPE html> (Removed) </html>";
    NSString *html = [NSString stringWithFormat:youTubeVideoHTML, self.view.frame.size.width, self.view.frame.size.height, videoID];
    [webView loadHTMLString:html baseURL:[[NSBundle mainBundle]resourceURL]];

    /* Setup Notification */
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(handleWhenDoneButtonClick:)
                                                 name:UIWindowDidBecomeHiddenNotification
                                               object:nil];
}

最后,我清理并“弹出”UIViewController:

-(void)handleWhenDoneButtonClick:(NSNotification *)notification {
    /* Remove Observer */
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIWindowDidBecomeHiddenNotification object:self.view.window];
    /* Remove UIWebView from hierarchy */
    [self.webView removeFromSuperview];
    /* Remove self from webView delegate */
    [self.webView setDelegate:nil];
    /* Remove reference because I can */
    [self setWebView:nil];
    /* Dismiss ViewController */
    [self dismissViewControllerAnimated:YES completion:nil];
}

对于一个足够简单的场景,似乎没有什么可以真正删除 UIWebView 占用的内存。正如您在这里看到的,内存使用量永远不会减少:

加载 UIWebView 之前:

Before opening the UIWebView

Once the UIWebView is Open: enter image description here

After popping the ViewController and removing references to UIWebView: enter image description here

据我所知,这里使用的内存量会无限期地持续存在。五分钟后,它仍将分配 34+ Mb。如果我打开ViewController再次,它会分配更多,一旦我再次弹出,我最终将获得大约 40 Mb 的“基本”使用量。

Leaks:没有被完全劝阻,我最初去寻找漏洞,认为我在某个地方犯了一些错误。然而,虽然我确实发现了一些非常small泄漏,它们似乎完全与UIWebView.

enter image description here

S.O 的其他案例:我在网上寻找解决方案已经有一段时间了,但我发现的唯一真正相关的线程是去年的一个,如下所示:UIWebView 占用大量内存

它还没有答案,这可能是因为(像与此主题相关的大多数其他问题一样),许多答复提供了通用/冲突的建议。比如建议你使用 ARC(谁不使用?),或者告诉 OP 他们不应该保留强引用(即使他们不这样做,代码也演示了这一点)。最后,一些答案只是声称内存管理一开始就不是问题,因为有足够的内存可供使用,而这些答案也没有帮助。

无论如何,这是我目前面临的问题。感谢您花时间阅读本文(如果您阅读了!)。


我也遇到过同样的问题。当推一个UIViewController with a UIWebView(加载 google.com)在 iOS 9 设备中,内存大小从 26 MB 变为 36 MB,并且在弹出控制器后保持不变。

我做了同样的测试WKWebView(iOS 8+) 而不是UIWebView。这次,内存大小从 26 MB 变为约 27.5 MB,弹出控制器后又回落至约 26 MB。

看来问题部分是由于方式造成的UIWebView已实施。也许你可以使用https://github.com/floatlearning/FLWebView,这是一个WKWebView with UIWebViewiOS 的后备。

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

UIWebView 没有释放内存 的相关文章

  • 使用 PHP 发送器和 Swift 在后台未收到 IOS GCM 推送通知

    我正在努力让后台通知在带有 GCM 的 IOS 上工作 非后台通知已经可以工作了 以下是我集成后台通知的步骤 在 UIBackgroundmodes 中启用远程通知标签 将内容可用密钥添加到我的通知负载中 在我的委托中编写 applicat
  • 我应该使用什么 Xcode 设置来支持armv6 和armv7?

    我最近将 Xcode 从 3 2 升级到 4 2 升级后 我在 iPhone 3 设备上测试我的应用程序时遇到问题 因为我的目标的 Build Settings Architectures 项设置为 armv7 将 Architecture
  • 如何用RXSwift实现UIPickerView

    就像 UITableView 一样 items bindTo tableView rx items cellIdentifier cellIdentifier cellType AttentionTableViewCell self row
  • Swift iOS - 视觉框架文本识别和矩形

    我试图在使用 Vision 框架找到的文本区域上绘制矩形 但它们总是有点偏离 我这样做是这样的 public func drawOccurrencesOnImage occurrences CGRect image UIImage gt U
  • 需要一些关于调度队列、线程和 NSRunLoop 的澄清

    以下是我所知道和理解的事情 全局队列是一个同时队列 可以将任务分派给多个线程 不保证执行任务的顺序 例如 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY DE
  • flutter run 无法在 iOS 模拟器上运行,但 Xcode 可以构建

    在我的 Flutter 项目中 flutter run命令无法将项目构建到 iOS 模拟器 但在 Xcode 中 当我单击构建按钮时 Xcode 可以毫无问题地构建它 我正在使用 AgoraRTC 库 添加 Flutter Quill 后就
  • CMDeviceMotion userAcceleration 颠倒了?

    我在 CMDeviceMotion 中的 userAcceleration 字段中看到一些意外的读数 当我查看来自 CMAccelerometerData 的原始加速计数据时 我发现如果 iPhone 平放在桌子上 则读数为 1G 垂直向下
  • 将自动布局约束应用于多个对象

    我正在 iOS 中使用 autoLayout 约束 我的用例是这样的 我会用图片更好地解释 我正在为 UITableViewCell 使用自定义单元格 通过自动布局 我为下面的文本和分隔线设置了约束 并且它们遵守自动布局约束 现在您可以看到
  • 在 Xcode 中的选择器上添加符号断点

    我的应用程序中有一个错误 显示以下 部分 堆栈跟踪 2011 11 25 01 55 59 760 Events2 6650 403 Event boolValue unrecognized selector sent to instanc
  • ASIHTTP:上传 UIImage?

    有人可以告诉我如何在 Objective c 中使用 ASIHTTPRequest 对象上传 UIImage 对象吗 我需要将其转换为 NSData 对象吗 这是头像上传网址 E g UIImage toUpload UIImage ima
  • 在XCode中快速查看Swift变量的类型

    有没有什么快捷方式可以让我在 XCode 中快速查看 Swift 中任何变量的类型 Alt 单击返回 无快速帮助 类型推断非常棒 但是如果没有这些工具 生活就会变得困难 Either use Alt click to display the
  • 如何构建一个类似iOS的设置模块?

    我对 iPhone 开发真的很陌生 目前我正在为我的应用程序设置一个选项模块 用户应该能够编辑一些首选项 我的第一个方法是有一些文本字段 但我真的很喜欢 iOS 处理编辑首选项的方式 有某种标签 单击该标签将打开另一个视图 其中包含用于编辑
  • 同时输入两个 uitextfield

    我想同时输入两个uitextfield 这可能吗 您可以使用以下代码来完成此操作 Typein2 h 声明了三个文本字段的类 textFieldBeingEdited textField是为了知道哪个textField text1或text
  • 从底部加载导航视图控制器

    我有四个 ViewControllers 其中 ViewControllers 使用以下方式加载UINavigationController 我能够一一切换到每个 ViewController 问题是 由于我使用的是 NavigationC
  • 将 NSWindow 的内容变灰

    我有一个NSWindow with 2 NSViews an NSSplitView和一个习惯NSView 访问数据以填充这些视图可能需要一些时间 在此期间 我想将这些视图的内容灰显 我的第一个方法是有一个黑色的第三个NSView覆盖另外2
  • 在 switch 语句中使用 NSString

    是否可以使用NSString in a switch陈述 还是直接使用会更好if else if 我在我的应用程序中使用这些宏 define CASE str if s isEqualToString str define SWITCH s
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • 修改曝光持续时间并返回 AVCaptureExposureModeContinouslyAutoExposure 后出现奇怪的行为

    我正在开发一个应用程序 该应用程序通过 iOS 8 中引入的新 API 公开相机的手动控制 并且我正在使用这个示例应用程序 https developer apple com library ios samplecode AVCamManu
  • iOS、Swift 3 - 当我从详细视图返回后单击“取消”时,UISearchBar 消失

    我在containerView中有一个tableView 以编程方式向其添加一个搜索栏 一切工作正常 除了这种情况 当我点击一个单元格时 当 tableView 由 searchBar 过滤时 然后我从明细视图返回 通过推送转场呈现 然后我
  • 如何将react-native与php一起使用并获取返回数据始终为空

    我的回报始终为空 我似乎无法让它发挥作用 我如何将react native与php一起使用并获取json 任何人都可以帮忙吗 PHP myArray array myArray lat POST lat myArray lng POST l

随机推荐

  • 样式表不适用于 Jekyll 主题 Freelancer bootstrap

    我已经有一个用户名 github io我的个人博客的存储库 现在我的目标是使用我发现的完全不同的主题创建另一个 github 托管的 jekyll 页面 这是我正在使用的主题的链接 https github com jeromelacaud
  • 使用 ReflectiveInjector 注入服务,无需指定依赖树中的所有类

    我目前有一个服务为我生成一个对象 该对象应该表现为一种活动记录 因为它可以在访问它的属性时延迟填充自身 我的第一种方法是将生成的对象使用的服务注入到创建服务中 然后将它们传递给创建的对象的构造函数 但由于创建服务从不使用这些服务 所以看起来
  • 如何将 CloudWatch 自定义日志组与 Python Shell Glue 作业结合使用?

    我有一些 Python Shell 类型的 Glue 作业 我想将作业日志发送到自定义 CloudWatch 日志组而不是默认日志组 我可以通过提供如下作业参数来实现 Spark 类型胶水作业 enable continuous cloud
  • 如何在 WinForms 应用程序中使用 Salesforce OAuth 2.0 隐式流身份验证?

    我编写了一个 Web 应用程序 它使用 OAuth 2 0 Web 服务器流连接到 Salesforce API 一切正常 但现在需要从 WinForms 桌面应用程序访问 Salesforce API 我陷入了困境 Salesforce
  • 在Scheme中添加一个元素到列表的末尾

    负责添加a到结束 b c 使 b c a 到目前为止 当我尝试时 print cons a b c I get a b c 但当我这样做时 print cons b c a I get b c a Stack 上的所有其他类似问题似乎都比这
  • Flutter:请求的资源上不存在“Access-Control-Allow-Origin”标头

    我已经使用 python Flask 创建了 REST GET API 它的代码如下 app Flask name app route youtube def firstGetAPI try url request args get url
  • 我们可以使用 Meteor 框架和 mysql 数据库吗

    我发现很多 Meteor 框架的参考网址 其中我发现 mongodb 作为数据库 因为我对 mongodb 没有太多了解 那么有没有办法实现mysql而不是mongodb There is一种方式 但就目前的框架而言 它是一条未铺砌的道路
  • 多线程聊天服务器

    我是线程新手 我正在尝试从服务器向客户端广播消息 但我不能 看起来服务器总是在侦听新连接 但我可以使用客户端终端向其他客户端发送消息 我的问题是如何在聆听的同时允许输入 这是代码 多线程聊天服务器同步 java import java io
  • 为什么我收到错误无法解析模块路径? Eslint 与 Typescript

    我阅读了很多资源 包括将 eslint 与 Typescript 结合使用 无法解析模块的路径 我一次又一次地遇到同样的错误 yarn lint 2 24 error Unable to resolve path to module com
  • 查找非 Visual C# 组件

    我尝试了多种方法来列出表单的所有非可视组件 例如 OpenDialog ImageList TableAdapters 等 但找不到任何内容 为了找到屏幕上的控件 我在 控件 屏幕中使用了 Foreach 但对于那些非可视组件我什么也没找到
  • 使用 JNI 时 Eclipse 对 C 文件的行为令人惊讶,为什么会这样?

    我正在开发一个 Android 应用程序 其中使用了大量 JNI 代码 最近 从过去 2 3 天开始 我真的对 Eclipse 的意外行为感到恼火 一旦我打开 c 文件 它就会显示模糊的错误 但是 如果我关闭并重新打开项目 错误就会消失 请
  • 获取一个月内的工作日

    我正在尝试获取给定月份内的日期 我的计划是 获取给定月份的开始日期和结束日期 获取该范围内的所有日期 迭代它们并使用以下方法消除周末内的日期isDateInWeekend method 其余日期为工作日 所以我创建了两个NSDate扩展方法
  • groovy++ 发生了什么? [关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚偶然发现了 groovy 发现它非常有趣 不幸的是 它似乎没有进一步发展 根据 github 的说法 最后一次提交是一年多前 邮件列表完全不活跃 最后一条消息是在四月份返回的 最近没有这方
  • 如何从 XML 文档中删除所有文本

    如何删除所有文本 但保持结构完整 例如
  • 清除MySQL查询缓存而不重新启动服务器

    有什么办法可以clear mysql 查询缓存无需重新启动 mySQL 服务器 我相信你可以用 RESET QUERY CACHE 如果您运行的用户具有重新加载权限 或者 您可以通过以下方式对查询缓存进行碎片整理 FLUSH QUERY C
  • MySQL - 来自另一个表的总和

    我想运行一个包含另一个表中的总和的 select 语句 我知道我可能需要设置一个连接 但我不知道如何处理它 我想选择一个帐户列表 然后获取它们的余额 来自另一个表的总和 这是我一直以来的想法 但显然它是不正确的 SELECT account
  • 如何从 Android 应用程序将 db 文件上传到 google 驱动器?

    我想将数据库文件从我的应用程序上传到谷歌驱动器 我可以在谷歌驱动器中创建一个文件夹 但我不知道如何上传数据库文件 这是我的代码 import java io BufferedInputStream import java io Buffer
  • 使用 Gatsbyjs 包含本地 JS 和 CSS 文件

    我对这个完全陌生gatsbyjs生态系统 同时我正在学习一些reactjs 我最近购买了一个 html 模板 并尝试将其用作 UIgatsbyjs应用 该模板有很多 css 和 js 无论是专有的还是定制的 这意味着没有插件gatsbyjs
  • 添加对 Jtree 的拖放支持

    我想为我的 JTree 应用程序添加拖放支持 我创建了一个自定义的 DefaultMutableTreeNode 子类 有一个默认的 TreeCellRenderer 我需要添加哪些内容以及在哪里添加 最简单的方法是1 调用tree set
  • UIWebView 没有释放内存

    我在尝试恢复分配给 a 的内存时遇到了一些真正的麻烦UIWebView在我的应用程序中 我本质上是创造并呈现UIWebView暂时为用户单独ViewController 然后删除所有引用并弹出ViewController从堆栈中 尽管做了所