iPhone开发Swift基础07 内存泄漏检测

news/2024/10/17 12:20:16/

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 表示允许开发者查看对象的循环调用情况。
在这里插入图片描述
下图展示了两个对象之间的强引用关系。
在这里插入图片描述
右侧的详情窗口,点击如下图展示的按钮,可以隐藏系统的方法,只保留开发者编辑的代码:
在这里插入图片描述
隐藏后:
在这里插入图片描述


http://www.ppmy.cn/news/662957.html

相关文章

是省还是亏?手工升级iPhone内存存在“后遗症”!...

除了不能享受保修,这种操作本身也存在风险。 没有32G版的iPhone一直是苹果的槽点,16G版的iPhone内存不够用,64G版的又贵了不少。最近,一些手机维修门店以及万能的淘宝已经提供手工升级iPhone内存的服务了。手工增加iPhone内存貌似…

iPhone内存比Android手机小,iPhone内存为什么一直这么小

近年来,和国产安卓手机的“慷慨”相比,iPhone的内存始终相当“吝啬”,最新发布的iPhone 11系列也不过4GB内存,甚至不如国产千元机。不过由于iOS的流畅度有口皆碑,曾经2GB iPhone干法6GB甚至8GB安卓手机是常有的事儿。 …

iPhone13内存不够怎么解决 iPhone13显示内存不足怎么办

iPhone13为用户提供了128、256和512三个存储版本,用户可以根据自己的实际使用需求来进行购买,下面小编带来iPhone13内存不足的4种解决方法 iPhone13为用户提供了128、256和512三个存储版本,用户可以根据自己的实际使用需求来进行购买,不过存储空间越大,软件占用的内存也会…

《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【Django】如何在django模型中添加一个*后面的必填字段

form.py 会被单独访问的字段(如使用{{form.as_p}}),然后可以将属性添加到您的ModelForm required_css_class = ‘required’ class MyForm(forms.Form):required_css_class = required这将定义的所有领域需要为具有“必要”类 然后你就可以使用CSS添加星号: test.html …

轻松玩转树莓派Pico之一、新手上路

目录 1、开发板介绍 2、芯片介绍 3、环境搭建 (1)sdk/example下载 (2)文档下载地址 (3)交叉编译器安装 4、编译example 5、运行example 1、开发板介绍 树莓派-Pico是树莓派基金会推出的第一款微控…

树莓派初学者?先做做这十个项目吧

http://www.leiphone.com/news/201511/7DAzK23RzBEJzvra.html?x207&y21 树莓派真是个好玩意儿!它非常实惠、高度便携而且使用非常方便。但对于刚入门的新手来说,刚拿到一块树莓派可能不知道首先应该做点什么项目。下面小编就为初学者筛选了10个适合…

树莓派之蓝牙编程

一、蓝牙配置及与手机通信 1、蓝牙介绍 (1)四种基本蓝牙profile 1. GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。 2.SDAP Profile: Service Discovery Application Profile&…