由donnywals于2019年12月9日发布
代码无法充分发挥功能的原因很多。 在一篇文章中,我向您展示了如何使用Time Profiler来测量代码中每种方法所花费的时间,以及如何分析结果。 尽管可以使用这些工具发现,分析和修复许多与性能相关的问题,但通常必须对调试的内存使用情况进行一些稍有不同的调试。 特别是与内存泄漏有关。

在今天的帖子中,我将向您展示如何使用Xcode中的Memory Graph工具来分析应用程序内存中保留的对象,以及如何使用此工具发现内存泄漏。 今天,我将特别关注保留周期。

Activating the Memory Graph

使用Xcode运行应用程序时,可以单击位于代码和控制台之间的内存调试器图标,如果未打开控制台,则可以单击Xcode窗口底部的内存:

当您单击此图标时,Xcode将为您的应用程序的内存图以及每个对象与其他对象之间的关系拍摄快照。 您的应用程序的执行将被暂停,Xcode将向您显示当前内存中的所有对象。 请注意,这可能需要一些时间,具体取决于应用程序的大小。

Xcode在左侧的侧栏中,显示了已发现的所有对象的完整列表。 当您在侧栏中选择一个对象时,中间部分将显示您选择的对象及其与其他对象的关系。 有时它是一个大图,如屏幕截图所示。 其他时候,它是一个只有几个对象的较小图形。

如果Xcode发现可能是内存泄漏或保留周期的关系,它将在边栏中的对象后面添加一个带有问号的紫色方块。 在您刚刚看到的屏幕截图中,紫色方块的位置非常明显。 如果它们更隐藏,或者您只想过滤内存泄漏,则可以使用侧边栏底部的过滤器菜单进行过滤,如以下屏幕截图所示:

上面的屏幕截图显示了两个不同对象的实例被保留在内存中,而Xcode认为不应这样做。 当您单击其中之一时,问题立即变得可见。

在此示例中,DataProvider和DetailPage指向彼此。 保留周期的经典示例。 让我们看看这种情况是如何发生的,以及您可以采取的解决措施。

了解retain cycles如何发生以及如何修复它们

在iOS中,当没有其他对象强烈引用它们时,会将它们从内存中删除。您在应用中创建的对象的每个实例都有一个保留计数。每当您将对对象的引用传递到代码中的其他位置时,其保留计数都会增加,因为现在又有一个对象指向该对象在内存中的位置。

保留计数的这一原则主要适用于类。因为当您在代码中传递类的实例时,实际上是在传递内存引用,这意味着多个对象指向同一内存地址。当传递值类型时,传递值时将复制该值。这意味着值类型的保留计数通常始终为1;指向一个值类型的内存地址的对象永远不会超过一个。

为了将对象从内存中删除,其引用计数必须为零;否则,引用计数必须为零。任何对象都不应引用内存中的该地址。当两个对象彼此保持引用时(在使用委托时通常是这种情况),这两个对象的引用计数可能永远不会达到零,因为它们彼此保持引用。请注意,我在本节的开头提到了一个强大的参考资料,我是故意这样做的。强引用造成的内存泄露问题,还可以通过Leaks工具来检测,具体步骤参考《iOS开发中的神兵利器》第10章的第23节:使用instruments Leaks工具检测内存泄露。

如果我们有很强的参考力,那么肯定存在弱参考权之类的事情吗?有!

弱引用是对引用类型实例的引用,这些引用类型不会增加引用所指向的对象的引用计数。这里适用的原理与在闭包中使用弱自我完全相同。通过使对象的委托属性变弱,委托及其所有者就不会彼此保持活动状态,并且可以释放两个对象。在示例中,我们正在研究这意味着我们需要更改以下代码:

class DataProvider {var delegate: DataDelegate?// rest of the code
}

分为以下内容:

class DataProvider {weak var delegate: DataDelegate?// rest of the code
}

为此,必须将DataDelegate限制为一个类,您可以通过在协议声明中添加:AnyObject来做到这一点。 例如:

protocol DataDelegate: AnyObject {// requirements
}

当您再次运行该应用程序并使用内存图查找保留周期时,您会注意到不再有紫色方块,并且内存图看起来完全符合您的期望。

总结

在本文中,我向您展示了可以使用Xcode可视化和浏览应用程序的内存图。 这可以帮助您查找内存泄漏并保留周期。 单击内存中的对象时,可以探索其与其他对象的关系,最终可以跟踪保留周期。 您还了解了什么是保留周期,它们如何发生以及如何打破它们。

译自:https://www.donnywals.com/using-xcodes-memory-graph-to-find-memory-leaks/

使用Xcode的memory graph查找内存泄漏相关推荐

  1. ios react_查找内存泄漏React本机应用程序(iOS)

    ios react by Jignesh Kakadiya 通过Jignesh Kakadiya 查找内存泄漏React本机应用程序(iOS) (Finding memory leaks react- ...

  2. java 内存泄漏 工具_Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法

    JProfiler的内存视图会话提供了内存使用情况的动态更新视图以及分配点的信息视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象.本文主要介绍如何意识到内存泄漏以及查找内存 ...

  3. 使用UMDH查找内存泄漏

    预览: 使用UMDH分析查找内存泄漏技术 上半年对内存泄漏查找作了一个总结,主要是使用crt的debug版本查找内存泄漏,但是存在的缺陷是只能定位到用户代码中自己分配的内存,对于使用其他库中分配的内存 ...

  4. Memory Analyzer分析内存泄漏

    Memory Analyzer分析内存泄漏 模拟一次内存溢出 程序不断地向ArrayList添加对象,直至溢出 public class User {String userName;String pa ...

  5. Umdhtools.exe: 如何使用 umdh.exe 来查找内存泄漏

    使用 UMDH 之前 如果您认为您遇到内存泄漏, 应注意, 内存泄漏可能不它们似乎什么. 您可能发现内存泄漏是不满足内存泄漏, 但是性能增强. 例如, MicrosoftJet 数据库引擎会消耗大量内 ...

  6. Memory Leak(内存泄漏)问题总结

    最近听了一些关于Memory Leak(内存泄漏)的seminar,感觉有些收获,所以留个记录,并share给朋友. 1 什么是Memory Leak. Memory Leak是指由于错误或不完备的代 ...

  7. 利用Android Studio的 Monitor Memory 查找内存泄漏

    App开发总会遇到内存泄漏的情况,在Eclipse时代我们一般使用MAT来配合分析,Android Studio会方便一些,因为它自带了一个Monitor Memory.下面我们来看看怎么使用这个工具 ...

  8. 使用VLD查找内存泄漏

    内存泄漏查找----------VLD VLD是VC++ 提供的内存泄漏查找工具 只能用于VC++编译器! 开始 下载地址:https://vld.codeplex.com/releases  ,下载 ...

  9. Eclipse Memory Analyzer,内存泄漏插件,安装使用

    网上文档很多,但最初都有问题.整理一份,作为备份.使用过程:开发代码写完后,对可能出现内存溢出的代码,添加配置文件,生成.hprof文件,用memory Analyzer分析排查问题,且泄漏内存大小可 ...

最新文章

  1. 贝叶斯理论与朴素贝叶斯分类理论(Naive Bayesian Model,NBM)
  2. exit()与_exit()的区别
  3. 鸿蒙公测新增6款手机,鸿蒙公测第二期报名入口 鸿蒙2.0第二期公测新增支持机型有哪些...
  4. boost::describe模块实现console的测试程序
  5. 改变Android的hello world程序字体颜色和背景颜色
  6. 计算4位数每位数相加之和(Python)
  7. java死锁2_Java面试必问-死锁终极篇(2)
  8. 测试唯一ID支持多大的并发量
  9. 网站左侧悬浮框随着滚动条滚动代码
  10. 《Master Bitcoin》学习笔记02——比特币的交易模型
  11. 编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
  12. 2018年秋招笔试面试----小学渣求职历险记(中南篇)
  13. python 求解二次规划(quadprog)
  14. 利用Blob进行文件上传的完整步骤
  15. 乖离率背离公式_掌握这“八大底部买入形态+主力抄底逃顶选股公式”,把握底部起涨点...
  16. 【数据结构】给定中序序列,有多少种前序序列
  17. Android 系列 5.13添加简单光栅动画
  18. colojure语言基础入门
  19. html/css移动界面侧滑效果
  20. 中国叶酒市场趋势报告、技术动态创新及市场预测

热门文章

  1. 2021年全球社交应用支出排行榜TikTok列榜首;小猪佩奇和抖音推出防沉迷系列视频 | 美通社头条...
  2. c语言游戏菜单栏界面设计,俄罗斯方块——菜单和游戏界面.cpp
  3. SparkSteaming实时接收网络端口数据和hdfs做Wordcount
  4. Python爬取百度翻译及有道翻译
  5. Windows系统的基础上装Ubuntu双系统系统分区问题
  6. 山峰和山谷 Ridges and Valleys(bfs)
  7. 计算机视觉 数据集(更新于2020.11.27)
  8. 哔哩哔哩 Web 首页重构——回首2021
  9. window文件共享访问记录清除命令
  10. c语言五子棋毕业设计,基于c语言五子棋小游戏--本科生毕业设计.doc