[Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10335778.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

目录:[Swift]通天遁地Swift

本文将演示使用Instruments Leaks工具检测应用程序中的内存泄漏问题。

内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

在项目文件夹【DemoApp】上点击鼠标右键,弹出右键菜单。

【New File】->【Swift File】->【Next】->【Save As】:People.swift->【Create】

 1 import Foundation
 2 //主人类
 3 class People
 4 {
 5     //名称属性
 6     var name : String
 7     //主人的宠物
 8     var pet : Pet?
 9     
10     //添加一个初始化方法,并以名称作为参数
11     init(name:String)
12     {
13         //设置对象的名称属性
14         self.name = name
15         //初始化日志
16         print("People is initialized.")
17     }
18     
19     //添加一个析构方法
20     deinit
21     {
22         //析构日志
23         print("People is deinitialized.")
24     }
25 }

使用相同的方式创建另一个类文件【Pet.swift】 

 1 import Foundation
 2 //宠物类
 3 class Pet
 4 {
 5     //名称属性
 6     var name : String
 7     //宠物的主人属性
 8     var master : People?
 9     
10     //添加一个初始化方法,并以名称作为参数
11     init(name:String)
12     {
13         //设置名称属性
14         self.name = name
15         //输出初始化日志
16         print("Pet is initialized.")
17     }
18     
19     //添加一个析构方法
20     deinit
21     {
22         //析构日志
23         print("Pet is deinitialized.")
24     }
25 }

在项目导航区,打开视图控制器的代码文件【ViewController.swift】 

 1 import UIKit
 2 
 3 class ViewController: UIViewController {
 4 
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7         // Do any additional setup after loading the view, typically from a nib.
 8         
 9         //添加一个按钮,当用户点击该按钮时,创建主人对象和宠物对象。
10         let button = UIButton(frame: CGRect(x: 0, y: 0, width: 280, height: 44))
11         //将按钮控件放置在根视图的中心位置
12         button.center = self.view.center
13         //设置正常状态下的标题文字
14         button.setTitle("PeopleAndPet", for: .normal)
15         //设置按钮的背景颜色为橙色
16         button.backgroundColor = UIColor.orange
17         //给按钮绑定点击事件
18         button.addTarget(self,
19                          action: #selector(ViewController.peopleAndPet), 
20                          for: UIControl.Event.touchUpInside)
21         
22         //设置根视图的背景颜色
23         self.view.backgroundColor = UIColor.orange
24         //并把按钮控件添加到根视图
25         self.view.addSubview(button)
26     }
27     
28     //添加一个方法,用来响应按钮的点击事件
29     @objc func peopleAndPet()
30     {
31         //添加一个主人对象和一个宠物对象
32         var master:People?
33         var dog:Pet?
34         
35         //对两个对象进行初始化操作,并设置它们的名称属性。
36         master = People(name: "Jerry")
37         dog = Pet(name: "Dog")
38         
39         //设置主人的宠物属性
40         //设置宠物的主人属性
41         //使两个对象相互引用,
42         //由于两个对象互相引用,所以两个对象并不会在内存中被释放。
43         master!.pet = dog        
44         dog!.master = master       
45 
46         //将两个对象置空
47         master = nil
48         dog = nil
49     }
50 
51     override func didReceiveMemoryWarning() {
52         super.didReceiveMemoryWarning()
53         // Dispose of any resources that can be recreated.
54     }
55 }

点击【Product】->【Profile】->在弹出的性能分析模块窗口中,选择需要的模块。

在此选择【Leaks】->【Choose】

点击左上角的记录按钮,开始运行程序。

应用程序启动之后,在内存状态时间图谱上,显示了一个泄露图标,点击此图标显示详细的内存信息。

此时在内存泄露堆栈列表中,显示了产生内存泄露的两个对象。点击选择第一个对象。

然后点击内存地址右侧的小箭头,显示内存分配的历史记录。

在此记录中,只看到了记录分配的时间,而没有内存被释放的时间。

所以也证明了该对象的内存,确认未被释放。

选择列表中的周期和根选项【Cycles & Roots】,此时显示了内存泄露的周期图。

从图中可以看出,内存泄露的问题是People对象和Pet对象循环引用造成的。

选择列表中的调用树选项选项【Call Tree】,

依次点击标签名称左侧的小箭头,查看内存分配的历史调用记录。

点击【设置】图标,进行显示选项设置面板。勾选【HideSystem Libraries】隐藏系统库。

此时只显示了开发者的调用记录,鼠标双击标签名称。显示了详细的代码信息。

点击左上角的软件图标,返回Xcode。将Pet对象的引用修改为弱引用。

 1 import Foundation
 2 //主人类
 3 class People
 4 {
 5     //名称属性
 6     var name : String
 7     //主人的宠物
 8     //将宠物对象的引用修改为弱引用。
 9     //就不会产生内存泄露的问题。
10     weak var pet : Pet?
11     
12     //添加一个初始化方法,并以名称作为参数
13     init(name:String)
14     {
15         //设置对象的名称属性
16         self.name = name
17         //初始化日志
18         print("People is initialized.")
19     }
20     
21     //添加一个析构方法
22     deinit
23     {
24         //析构日志
25         print("People is deinitialized.")
26     }
27 }

点击【Product】->【Profile】->【Leaks】->【Choose】

此时在内存分配时间图谱上,显示的是正确的内存分配和释放图标。

转载于:https://www.cnblogs.com/strengthen/p/10335778.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(174):constructor类反射编程

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public void setName(String name) {this.name name;}public String getName() {return name;}public int getAge() {return age;}public …

android 4.2 noclassdeffounderror,NoClassDefFoundError:android.support.v7.internal

运行Android 4.2的三星设备上的Android appcompat v7库存在问题。在我的开发者控制台中,我不断遇到以下堆栈跟踪崩溃:java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilderat android.support.v7.widget.PopupMenu.(Popu…

[国密算法]一文了解国密算法

国密算法概述1 SM1对称密码2 SM2椭圆曲线公钥密码算法3 SM3杂凑算法4 SM4对称算法5 SM7对称密码6 SM9标识密码算法7 ZUC祖冲之算法总结算法名称算法类别应用领域特点SM1对称密码算法芯片分组长度、密钥长度均为 128 比特SM2公钥密码算法加密ECC椭圆曲线密码机制256位 相比RSA&a…

java学习(175):method类反射机制

//class反射编程 //定义一个学生类 public class test124 {public String name;protected int age;double height;private double money;public void setName(String name) {this.name name;}public String getName() {return name;}public int getAge() {return age;}public …

java-web的mybatis的学习

idea开发必须是把Mapper文件与配置文件放到Resources标记的classpath目录下&#xff0c;eclips好像放到哪都行指定好路径就可以了&#xff0c; maven里面做好配置resources的路径&#xff0c;不然更新依赖 工程结构标记又没了 <build> <resources> <resour…

android 9格式吗,Android Studio中关于9-patch格式图片的编译错误

C&num;基础知识回顾-- 反射(3)C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...沙盒操作的核心函数 - NSSearchPathForDirect…

[Leedcode][JAVA][第85题][第221题][最大正方形][动态规划]

【问题描述】[第221题][最大正方形][中等] 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大/长方形正方形&#xff0c;并返回其面积。示例:输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 长方形 输出: 6 正方形 输出: 4【解答思路】 1. 长方形 暴力 时间…

java学习(176):第一个xml的编写

<?xml version"1.0" encoding"UTF-8"?> <stdents><!--每个student表示一个学生对象--><student code"stu001"><name>歌谣</name><birth>1996-09-09</birth><sex>男</sex><adr…

次时代各制作插件使用方案以及技巧 包括UV 烘焙 减面等

次世代游戏的到来&#xff0c;使游戏行业向前迈进了一大步。次世代本来代表的是拥有更高cpu硬件设施的电视游戏&#xff0c;即戴着头盔能感到wii拳击的震动、拿着拳套能感应阴森恐怖的氛围。绝对让玩家融入气氛的Xbox360的《生化危机5》还带有场景破坏&#xff0c;能打下一片墙…

java学习(177):获取应用程序的路径

import javax.tools.Tool; import java.net.URLDecoder;//获取类路径 public final class test132 {public static String getClassPath(){String pathtest132.class.getClassLoader().getResource( "" ).getPath().toString();try {return URLDecoder.decode( path…

[Leedcode][JAVA][第69题][x的平方根][二分查找][数学]

【问题描述】 实现 int sqrt(int x) 函数。计算并返回 x 的平方根&#xff0c;其中 x 是非负整数。由于返回类型是整数&#xff0c;结果只保留整数的部分&#xff0c;小数部分将被舍去。输入: 8 输出: 2 说明: 8 的平方根是 2.82842..., 由于返回类型是整数&#xff0c;小数部…

K-D Tree 学习笔记

K-D Tree 学习笔记 最近看了一下k-NN然后它说如果特征空间维数比较低的时候用K-D Tree来求k近邻比较快所以就来补一下学OI时没学的K-D Tree假装写一个学习笔记吧。 是什么&#xff1f; 是一个平衡二叉树 k1的时候就是一只BST k>1的话&#xff0c;每一层换一维来分割 就是用许…

html将excel数据自动导入到网页,如何把excel表中的数据自动输入到网页中

怎么把excel表中的数据自动输入到网页中因要给员工网上投工伤保险&#xff0c;员工资料在excel表中&#xff0c;现在在网上投保险时只能一笔笔的复杂粘贴到网页中&#xff0c;有没有办法能直接把excel表中的资料自动输入到网页中的对应的表格中呢&#xff1f;请知道的朋友说下方…

高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )

理论拓扑 环境准备&#xff1a; N 台 Linux 测试服务器 操作系统版本 CentOS 6.5 32bit ***系统分区要求&#xff1a;需要为格式化的空分区*** IP 地址&#xff1a; mfsmaster&#xff1a;10.3.0.81 心跳 ip 192.168.1.11 mfsbackup&#xff1a;10.3.0.82 …

k-means 聚类过程演示

k-means是一种非监督 &#xff08;从下图 0 当中我们可以看到训练数据并没有标签标注类别&#xff09;的聚类算法&#xff1a; K-Means clustering intends to partition n objects into k clusters in which each object belongs to the cluster with the nearest mean. This …

html网页距离顶部50像素,HTML5 教程之CSS Padding(填充)

CSS Padding(填充)CSS Padding(填充)属性定义元素边框与元素内容之间的空间。Padding(填充)当元素的 Padding(填充)(内边距)被清除时&#xff0c;所"释放"的区域将会受到元素背景颜色的填充。单独使用填充属性可以改变上下左右的填充。缩写填充属性也可以使用&#x…

PHP在金山游戏运营中的应用

PHP在金山游戏官方网站中的应用&#xff1a; ①、PHP团队协作开发&#xff1b; ②、PHP系统架构应用。 PHP在金山游戏运营系统 Keyes 中的应用&#xff1a; ①、分层架构设计模型&#xff1b; ②、通用性API接口设计 PHP在金山游戏官方网站中的应用 PHP团队协作开发环境 PHP…

[Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]

【问题描述】 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可…

html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...

本文实例总结了Javascript DOM事件操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;使用JavaScript可以对HTML页面上的各种事件进行监听&#xff0c;如鼠标点击/释放&#xff0c;鼠标悬停/离开&#xff0c;等等。效果图&#xff1a;代码&#xff1a;/p>"ht…