如何清除 Objective-C 中常驻的脏内存?

2024-01-23

我观看了 Apple 的 WWDC 2010 视频《Advanced Memory Analysis with Instruments》,从中我发现了大量常驻脏内存。我意识到拥有如此多的常驻脏内存是一件坏事(这可能是我的应用程序崩溃的原因......),但我不知道如何修复它。我应该去哪里看?

Instruments 向我展示了许多潜在有用的信息,但对我来说看起来像是胡言乱语,例如:

% of Res  Type                      Resident Size
18%       VM_ALLOCATE (8192 pages)  32.00 MB

这是“脏”类别 - 32 MB 常驻脏内存对于只有 256 MB 的设备来说已经很多了,对吧? :) 还有几个像这样的大块。我如何从 Instruments 追溯到我的代码?或者我应该忘记仪器并寻找代码中的特定问题?


在设备或模拟器中运行时,您是否看到这个 32 MB 的 VM_ALLOCATE 块?

我问这个问题是因为当我在我正在开发的 OS X 应用程序上使用分配工具时,我还注意到了一个 32 MB 的 VM_ALLOCATE 块,我想知道这是否是在 OS X 环境中运行的副产品。在设备上运行可能会为您提供不同的数据集。

不过,一般来说,常驻内存是您的应用程序正在使用但未换出到磁盘的内存。在 iOS 上,没有交换,因此驻留内存应该等于您的虚拟内存占用量。

脏内存是您分配和使用的内存。脏内存应该小于常驻内存,因为后者包含代码(您的代码和框架)。

我不确定您在应用程序中到底在做什么,但我猜您已经从捆绑包中加载了一些大型资源并保留它们。尽可能不要这样做。

在加载使用内存映射技术而不是暴力读取字节的 NSData 对象时,您还可以使用一些 API。这些可能会更好,因为它允许操作系统延迟从磁盘读取页面。对于 NSData(因为它是不可变的),它也可能足够聪明,可以将页面标记为只读。从理论上讲,这对操作系统来说是一个有价值的提示,它可以在压力下清除这些页面,因为它知道它们无法更改。阅读文档+[NSData dataWithContentsOfMappedFile:].

对于图像,我记得读过一些建议避免的内容imageNamed:除了您经常通过应用程序使用的图像(即 UI 元素)。特别是对于大图像,它们可能保留在您无法控制的缓存中。 (imageNamed:在 2.x 中出现了泄漏,但在 3.x 中已修复,并且今天可以完全安全地使用。)imageWithContentsOfFile:对于较大的图像和不是用户界面中重复出现的部分的图像。

如果您从网络加载图像,请将它们缓存在磁盘上,并在创建后释放原始字节UIImage。如果图像视图由于内存压力而被卸载,您不想再次访问网络来加载数据,但您也不想保留两个副本(一个NSDataUIImage)已加载。

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

如何清除 Objective-C 中常驻的脏内存? 的相关文章

  • 创建宏来执行默认初始化

    我有很多重复这个简单样板的方法 id myObject if myObject self myObject myObject class new return myObject 所以我想用一个简单的宏来替换它 define default
  • 如果您查看内部,nib 文件到底是什么样子的?

    我刚刚学习 nibs 和 swift 并对某些东西感到好奇 我知道 如果您有一个 main storyboard 文件 则首先加载根视图控制器的笔尖 然后加载该视图控制器下可能分层存在的任何视图 但是 我想知道一些事情 当他们说笔尖已 加载
  • 核心数据:解决一个奇怪的 EXC_BAD_ACCESS 错误

    我在核心数据方面面临着一个非常奇怪的问题 我们来描述一下 定义 假设我有两个模型 ModelA and ModelB 在数据模型中ModelA有参考ModelB作为一对多关联 因此ModelB与 具有一对一关联ModelA Update 当
  • 错误:模块是为不兼容的目标arm64-apple-ios8.0创建的

    有一个名为 Appetize 的网站 需要 app 捆绑包 应用程序的 iOS 模拟器版本 才能在在线模拟器中显示您的应用程序 以下是所需应用程序包的指南 https support appetize io help how to uplo
  • 我可以使用 NSDateFormatter 将此日期字符串转换为 NSDate 吗?

    我有这个字符串 2010 08 24T16 00 00 05 00 我想从中提取时间部分 即 16 00 并将其转换为 12 小时等效值 即下午 04 00 我正在尝试使用 NSDateFormatter 来完成此任务 但它不起作用 NSD
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • 未安装的应用程序的URL方案

    简单的问题 我正在开发一个将注册自己的 URL 方案的应用程序 我计划通过人们最喜欢的 QRCode 阅读器使用 QRCode 启动该应用程序 我的问题 如果我的应用程序尚未安装在他们的 iPhone iPad 上 会发生什么 他们会被引导
  • iOS 复合谓词

    我正在编写一个具有照片数据库的应用程序 每张照片都有多个与之关联的标签 并且该应用程序有一个带有大量切换的搜索页面 允许用户仅根据他们感兴趣的标签搜索照片 每个标签都存储了integerID 是因为它们对应于外部数据库的 ID 所以我尝试简
  • UICollectionviewcell 更改背景

    如果我知道部分编号和项目编号 如何更改单元格中的背景 下面的代码显示了我如何尝试做到这一点 UICollectionViewCell collectionView UICollectionView collectionView cellFo
  • Xcode 本地化设置中没有加号或减号按钮

    我需要在两天内翻译 iOS 应用程序 但我的 XCode 版本 4 4 和 4 5 Developer Preview 都没有给我添加其他语言的选项 我只能选择单击 Make localized 但我只能选择英语 选择它后 Xcode 中的
  • 获取 Swift 子目录中资源的所有 URL

    我正在尝试为 iOS 应用程序的子目录中的所有资源创建 URL 数组 我似乎无法到达正确的路径 即使我不知道名称 我也希望能够检索 URL 即我不想将文件名硬编码到代码中 Below is a screen shot of the hier
  • 子视图控制器旋转方法未被调用

    Summary 我试图将子视图控制器添加到父视图控制器 并让父视图控制器通知子视图控制器旋转事件 但是 旋转消息不会转发到子视图控制器 这是默认行为 为什么这种默认行为没有发生 环境 iOS 7 XCode 5 OSX 10 9 Detai
  • SDWebImage 显示缓存中图像的占位符

    在 iOS 5 1 项目 iPad 中使用 SDWebImage 3 我们展示相当大的图像 700x500 并且我们有很多图像 1000 我们预取图像并缓存到磁盘 然后允许用户浏览它们 效果很好 除了当您浏览图像时 您总是会看到占位符显示一
  • iPhone,如何将一张图像叠加到另一张图像上以创建要保存的新图像? (水印)

    基本上 我想拍摄用户从照片库中选择的图像 然后应用水印 即右下角的三角形 上面有应用程序名称 我已经在 Photoshop 中用透明层制作了第二张图像 我尝试了一个函数 我不记得它的确切名称 但它涉及 CGIImages 和蒙版 这将两个图
  • 将 Facebook 图片 URL 上传到 Firebase 存储

    我正在尝试将用户的 Facebook 个人资料图片上传到 Firebase 存储 let dictionary result as NSDictionary let data dictionary objectForKey data let
  • 如何正确使用 nsoperationqueue 的 autoreleasepool

    我有一个正在重构的应用程序 我刚刚实现了多线程 以便 UI 可以运行得更流畅 在 iPhone 模拟器中 我没有遇到任何泄漏 但在运行 iOS 4 2 的 iPhone 3G 上进行测试时 出现了内存泄漏 我已经做了很多搜索来使用操作队列实
  • Objective-C 声明的 @property 属性(非原子、复制、强、弱)

    有人可以向我详细解释一下我何时必须使用每个属性 nonatomic copy strong weak等等 对于声明的属性 并解释每个属性的作用是什么 某种例子也很好 我正在使用ARC 非原子的 Nonatomic https stackov
  • 如何在 XCode5 中将部署目标更改为 5.1.1 [重复]

    这个问题在这里已经有答案了 我正在一个项目中工作 我需要支持 iOS 5 1 1 但在 部署目标 的下拉菜单中我没有 5 1 1 作为选项 我的问题是如何将 iOS 5 1 1 添加为部署目标 我将非常感谢你的帮助 如果您愿意 您可以在框中
  • NSURLConnection 是否自动保留从服务器发送的 cookie?

    我从 ios 登录到我的龙卷风后端并发回 secure cookie 我注意到只要验证我设置的 secure cookie 我还可以请求其他信息 NSURLConnection 会保留 cookie 多久 或者关闭应用程序后 cookie

随机推荐

  • 使用朴素贝叶斯分类器对推文进行分类:一些问题

    除了其他来源之外 我还使用 Stackoverflow 上的各种帖子 尝试实现自己的 PHP 分类器 将推文分为正面 中性和负面类别 在编码之前 我需要理清流程 我的思路和例子如下 p class p words class Bayes t
  • Nemerle 和 F# 在 .Net 上的功能比较

    社区维基问题 根据这个问题 在 Net 中使用 Scala 有什么好处 https stackoverflow com questions 3587499 what are the benefits of using scala in ne
  • ios7中光标可见性问题

    只需创建一个UITextField in ios7 SDK但是当我输入一些内容时 会显示文本UItextField但光标不是 关于可能出现什么问题的任何线索吗 使用光标更改 UITextField 的tintColor mobileText
  • Java 中的重定向 stdin 和 stdout

    我正在尝试重定向 java 中子进程的标准输入和标准输出 最终我会将输出转到 JTextArea 或其他东西 这是我当前的代码 Process cmd Runtime getRuntime exec cmd exe cmd getOutpu
  • C# 映射两个复杂对象

    我有四门课 public class Customer public string FirstName get set public string LastName get set public List
  • 获取从 firebase firestore 返回的文档中的特定字段

    所以 我有一个可能非常容易解决的问题 我只是不太明白 本质上 此时我正在尝试将特定文档的字段存储到 2 个变量中 以便我可以在其他地方使用它们 这是我的 firestore 层次结构 这是我到目前为止的代码 我认为我走在正确的轨道上 但我不
  • 如果类“包含”或正则表达式,美丽的汤?

    如果我的班级名称不断不同 例如 listing col line 3 11 dpt 41 listing col block 1 22 dpt 41 listing col line 4 13 CWK 12 通常我可以这样做 for Eac
  • Mercurial:获取有关存储库的信息而不克隆它们

    几天前 我开始尝试 Mercurial 一切都很顺利 直到我决定尝试编写一个小程序 该程序从远程服务器获取存储库列表和每个存储库的变更集 ID 列表 允许用户选择存储库并变更集 克隆它并更新到所选的修订版 这引发了两个问题 有没有办法从服务
  • 尝试将字符串文字作为模板参数传递[重复]

    这个问题在这里已经有答案了 我正在尝试找到一种舒适的方法来将字符串文字作为模板参数传递 我不关心支持尽可能多的编译器 我正在使用最新版本的 g std c 0x 我尝试了很多可能的解决方案 但都令我失望 我有点放弃了 但首先我想知道why其
  • 在Python中评估布尔环境变量

    在Python中如何评估环境变量是否为布尔值True 使用是否正确 if os environ ENV VAR is True Option 1 我认为这很有效 my env os getenv ENV VAR False lower in
  • XNA 查看矩阵 - 寻求解释

    我在理解 XNA 中的视图矩阵时遇到了一些严重的问题 我已经在所有其他部分方面取得了很大的进展 并且由于我刚刚学会了所需的数学知识 因此我不想在不首先了解内置矩阵函数的作用的情况下使用它们 现在我了解了旋转 投影和平移的基础知识 但我一生都
  • 在 .NET 中跨 AppDomain 移动对象

    有没有办法在 AppDomain 之间高效共享或移动 NET 对象 我意识到 AppDomains 的目的是提供隔离 但是我有一个情况 我需要移动一组相对较大的缓存不可变对象 这些对象的计算和创建成本很高 目前 我有一种有效的序列化方法 但
  • 如何从纬度和经度获取完整的地址?

    我想从 android 中的纬度和经度获取以下值 街道地址 市 州 Zip 完整地址 如何实现这一目标 Geocoder geocoder List
  • 在非角度页面上使用量角器测试登录

    我正在尝试使用量角器进行 e2e 测试 但首先我需要登录非角度页面 我尝试按照指示直接使用 webDriverhere http ng learn org 2014 02 Protractor Testing With Angular An
  • Xamarin Forms 在模拟器和设备上项目空白谷歌地图

    I have created a cross platform App using Xamarin forms On Mac Book Pro el Capitan I need to use maps in it thus using X
  • 错误:“在清单中找不到版本代码。”

    我正在尝试构建签名的应用程序包 以便发布 我所做的只是更新操作系统版本和一些图形 该应用程序在 ADK 上运行得很好 当构建签名的 apk 时 我收到以下错误消息 在清单中找不到版本代码 这是错误日志 由以下原因引起 com android
  • 英特尔编译器值得吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 非常简单 是英特尔编译器 http software intel com en us intel compilers 值得入手吗 我主要从事系统
  • Ubuntu 中的 PostgreSQL pg_dump 语法错误

    在 ubuntu 16 04 中 当我想运行 pg dump 时 它不起作用 我收到此错误语法错误 怎么了 postgres pg dump db name gt db name1 sql postgres postgres ERROR s
  • from __future__ import ... 能否保证 Python 2 和 3 的兼容性?

    我对热身 Python 2 还是 Python 3 不感兴趣 问题 尽管最近的一个 https stackoverflow com q 5478518 321973我发现已经一岁多了 但我偶然发现 如果您的文件开始 您可以在 Python
  • 如何清除 Objective-C 中常驻的脏内存?

    我观看了 Apple 的 WWDC 2010 视频 Advanced Memory Analysis with Instruments 从中我发现了大量常驻脏内存 我意识到拥有如此多的常驻脏内存是一件坏事 这可能是我的应用程序崩溃的原因 但