Instruments

Instruments工具是用于动态跟踪和分析代码的工具,可以跟踪一个或者多个进程,并检测收集实时数据,使开发者更好地理解应用程序和操作系统的行为和性能。

  • 追查代码中难以重现的问题
  • 对应用程序进行性能分析
  • 自动化测试应用程序中的代码
  • 对应用程序进行压力测试
  • 进行一般的系统级故障诊断
  • 对应用程序的代码如何工作有更加深入的了解

Allocations

Instruments中的Allocations工具可以显示内存中的对象占用曲线,内存当前都分配给那些对象、被分配内存对象数量以及由哪些函数进行对象的创建。

因此可以借由此工具了解到应用程序中的内存分配状态,从而定位应用程序内存效率低下的地方。

iOS应用程序的开发中,内存分配是交由ARC(自动引用计数)技术来实现的,但该技术也有局限性,比如两个对象相互强引用的时候,其解决办法也有,但是一般难以发现,这时可以使用Allocations工具进行内存泄漏的检测。

模拟相互强引用的代码:

class Student: Person {var classmate:Student?override init(personName: String) {super.init(personName: personName)print("\(name) 被创建")}deinit {print("\(name) 被销毁")}
}override func viewDidLoad() {super.viewDidLoad()//Swift中除非是可选类型的对象,不然不可以被置为nilvar xiaoMing:Student? = Student.init(personName: "xiaoMing")var liHua:Student? = Student.init(personName: "liHua")xiaoMing?.classmate = liHua  //相互强引用liHua?.classmate = xiaoMing  //相互强引用//销毁xiaoMingxiaoMing = nilliHua = nil
}

运行结果:

从结果可以看见,当ViewdidLoad运行完,两个对象都没有调用deinit方法,也就是说两对象都没有被销毁,可以证实已经发生内存泄漏了。

使用Allocations工具进行内存检测

Product > Profile 等待编译完成后,在弹出的窗口选择Allocations。

然后在Allocations界面点击左上角的录制按钮,之后模拟器就会自动运行起来,同时进行内存的实时监测。

在过滤器中输入实验类的类名,能在一众对象列表中找出对象,由上图可知,虽然我们在代码中最后将两个对象分别置为了nil,但是从上图展示的结果看仍有两个对象处于Persistent的状态,说明两个对象并没有被释放。

点击上图所示的箭头,右侧的窗口会展示该对象的一些详情。

如上图所示,其中带有user图像的是双击该代码能跳转到该代码的位置进行观察,但是在此界面还不能进行修改,只可以进行点阅。

点击上图所示的按钮,就能跳转回到XCode代码处进行修改了。

对强引用的代码进行修改:

class Student: Person {weak var classmate:Student?override init(personName: String) {super.init(personName: personName)print("\(name) 被创建")}deinit {print("\(name) 被销毁")}
}

接着关闭掉Allocation的界面,重新开启。

这时候我们在过滤器中输入类,可以发现已经没有结果了,也就是说,刚刚的内存泄漏的对象已经在这次调试中被释放了。

这时,我们选择如上图所示的All Allocations ,这时就可以发现两个Student对象处于Transient状态,也就是说这两个对象曾经存在于内存中,但目前已经被释放掉了。

想要了解该被释放的对象的创建时间、释放时间等详细信息可以点击类对象右侧的箭头查看。

日志相关的打印结果也证实了该两对象已经被释放了:

Leaks

Leaks工具可以检查进程堆泄漏的内存。开发者可以使用该工具并配合Allocations来获取内存地址的历史记录。

通过Leaks工具可以查看内存泄漏的对象数量、泄漏对象的类型、内存地址、占用大小等信息。

案例沿用Allocations小节中的代码。

Product > Profile 等待编译完成后,在弹出的窗口选择Leaks。


同样在点击录制按钮之后,就可以开始观察到在Leaks栏出现了一个错误❌样式。

表示该时间节点位置产生了内存泄漏现象,并且在下方有着其详细的信息。选中其中一个对象的右侧箭头,就能查看其内存地址的历史列表,可以看到该地址的RefCt值为1,意味着内存并没有被释放。

接着点击Leaks表格图标显示其项目列表,选中Cycles & Roots 表示允许开发者查看对象的循环调用情况。

下图展示了两个对象之间的强引用关系。

右侧的详情窗口,点击如下图展示的按钮,可以隐藏系统的方法,只保留开发者编辑的代码:

隐藏后:

iPhone开发Swift基础07 内存泄漏检测相关推荐

  1. iPhone开发Swift基础03 视频、网络请求

    视频播放AVPlayer iOS9之前使用的是MPMoviePlayerController,随着iOS不断迭代,AVPlayer成为主流. 往项目中添加资源文件: import UIKit impo ...

  2. Valgrind ---内存调试,内存泄漏检测以及性能分析的软件开发工具

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具.Valgrind这个名字取自北欧神话中英灵殿的入口. 一般使用方式  valgrind --leak-check=full ...

  3. iOS开发之内存泄漏检测工具-Leaks

    引言 我们在实际开发过程中,经常会不小心造成循环引用问题,从而造成内存泄漏问题,那么我们该如何检测我们工程那个位置存在内存泄漏问题呢?这就需要用到Xcode自带的内存泄漏检测工具-Leaks. 内存泄 ...

  4. Android 性能优化之内存泄漏检测以及内存优化(上)

    在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来 ...

  5. Linux内存泄漏检测工具 Valgrind使用

    一 .valgrind简介 最近在Linux下程序碰到了内存泄漏的问题,所以在网上找了找Linux下的内存泄漏检测工具,找到了Valgrind这款功能很强大的内存调试.内存泄漏检测以及性能分析.检测线 ...

  6. Unix下C程序内存泄漏检测工具Valgrind安装与使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  7. OpenCV中的内存泄漏检测

    转自:http://chaishushan.blog.163.com/blog/static/130192897200911685559809/ 内存泄漏时程序开发中经常遇到的问题. 而且出现内存泄漏 ...

  8. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  9. 基于Android Studio的内存泄漏检测与解决全攻略

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

最新文章

  1. SpringIOC源码分析总结
  2. thankpad p15改善大风扇的转动
  3. 域名扫描工具Fierce
  4. sw运行很卡怎么办_windows10系统SolidWorks运行速度很慢如何解决
  5. Oracle数据库asm原理,Oracle数据库中ASM功能解剖
  6. 关于百度地图 BMap.InfoWindow 只显示最后一条信息解决方法
  7. 深度学习-Tensorflow2.2-图像处理{10}-图像定位/优化/图运算/及GPU优化等-22
  8. 解决 Successfully created project '' on GitHub, but initial push failed: Could not read from remote re
  9. JCheckbox全选
  10. linux shell 编程
  11. ubuntu14.04 upgrade出现【Ubuntu is running in low-graphics mode】问题的一个解决办法
  12. ts语音自建服务器,自建TeamSpeak语音服务器,免费提供给专注游戏的玩家使用!...
  13. Java基础学习总结(85)——Java中四种线程安全的单例模式实现方式
  14. php 控制器方法,ThinkPhp3.2跨控制器调用方法
  15. Problem L. Visual Cube(杭电多校2018年第三场+模拟)
  16. 1.1.3开启线程(Starting a Thread)
  17. mmap映射方式读写本地文件
  18. CSDN页面上方广告条太烦人?js写个油猴脚本给它隐藏了~
  19. 计算机一级考试2018知识点,2018年全国计算机一级ms office考试内容
  20. edge播放视频HTML5黑屏,Win10 edge浏览器播放视频黑屏解决方法

热门文章

  1. 域名品相分析 - 分析域名是否 数字 字母 拼音 几拼 杂米
  2. 窥视Linux内核的行为的一些方法
  3. Datawhale集成学习:Stacking 算法与实战
  4. 如何用python爬新闻_干货:如何利用 Python 爬虫实现群发新闻早报?(详细)
  5. Promise系列学习
  6. keil c语言 打开文件,第5节:用keil软件新建,关闭,打开一个完整工程的操作流程...
  7. 熊大UWB系列教程二:KEIL软件环境搭建以及程序下载
  8. Linux 软件安装到哪里合适,目录详解
  9. 十篇文章速览多模态语言生成的研究进展
  10. HD 2187 悼念512汶川大地震遇难同胞——老人是真饿了 【背包问题】