使用Leaks定位iOS内存泄漏问题并解决

news2024/9/21 1:24:25

使用Leaks定位iOS内存泄漏问题并解决

前言

内存泄漏问题一直是程序开发中最令人头疼的问题,特别是C/C++。虽然C/C++在C++11之后引入了许多新特性,包括智能指针,自动类型推导等,但C++中动态内存的分配和释放仍然需要程序员来显式地进行。
在Objective-C中,内存管理主要依赖于引用计数机制,每当一个对象被创建或被复制时,它的引用计数初始化为1。当创建一个对象的副本或增加一个引用时,对象的引用计数会增加;当释放一个对象或减少一个引用时,对象的引用计数会减少;当对象的引用计数降到0时,系统会自动释放该对象占用的内存。可以看到OC的内存管理机制需要程序员有意识地管理对象的生命周期,这一点和C/C++相似。但OC逐渐开始支持ARC,程序员不再需要显式地管理对象的生命周期,但ARC的实现机制却与C/C++不同,它通过编译器的优化,自动地管理对象的生命周期。即在编译过程中,ARC会自动地插入retainreleaseautorelease等方法,以实现对象的生命周期管理。

在OC/C/C++混编中,为了检查、定位及解决内存泄漏的问题,Xcode提供了检查内存泄漏的相关工具,而今天主要介绍的是Instruments工具中的Leaks工具。

Leaks工具主要用来检测malloc分配出来的内存块,而对于非malloc的内存块则不支持检测。

Leaks内存泄漏检测实践

实践软硬件
1. Xcode Version 15.4 (15F31d)
2. iOS开发工具链17.5
3. 模拟器 iphone 15 pro (iOS 17.5)/ 真机 iPhone 11 pro max(iOS 17.5)
4. 开发机器:MacBook Pro (18GB, APPLE M3 pro)

声明: 本文涉及相关内容仅适用于当时开发环境,仅可做参考。在进行操作时,请注意备份,谨慎操作!

  1. 假设你已经使用Xcode创建了一个工程,并完善了其功能,现在需要来检测内存是否泄漏。打开Xcode中open Developer Tool,选择Instruments,在Instruments中选择Leaks
    在这里插入图片描述

  2. Leaks左上方可以选择对应检测的机器和进程。
    在这里插入图片描述
    在这里插入图片描述

  3. 在XCode中运行对应APP,然后点击Leaks工具中左上角的小红点,开始监测。

  4. 在运行APP时,我们进行各项操作,Leaks会动态监测APP是否出现了内存泄漏,当出现下图中的红色叉号时,表明出现了内存泄露。如果没有内存泄漏则会出现对号,这一显示大概每十秒更新一次。
    在这里插入图片描述

  5. 点击如下图所示的Leaks所在的那一行,将Leaks工具中的Allocations选项卡切换到Leaks选项卡。并把下图中步骤2的Leaks改为Call Tree
    在这里插入图片描述

在这里插入图片描述

  1. 点击Leaks下面的Call Tree选项,勾选Invert Call TreeHide System Libraries
    在这里插入图片描述

按照网上博客的说法,上面四个选项分别表示
Separate by Thread 按线程分割
Invert Call Tree 反转调用顺序
Hide System Libraries 隐藏系统库
Flatten Recursion 展平递归
我们勾选了反转调用顺序和隐藏系统库,就可以更加便捷地看到是哪里发生了内存泄漏;

  1. 现在你已经可以看到哪些地方发生了内存泄漏和内存泄漏的相关信息;

在这里插入图片描述

内存泄漏位置定位

上文已经找到了哪些函数发生了泄漏,还定位不到具体泄漏的位置。

如果你已经幸运地配置好了,那么你现在双击泄漏的函数就可以跳转到代码中的具体位置。如果你的不行,那么只需要简单配置一下就可以。

  1. 在Xcode的工程文件的配置Build Settings中,搜索Debug Information Format,默认情况下,该选项下DebugDWARF,修改为DWARF with dSYM File

在这里插入图片描述

  1. 重新编译,运行APP, 启动Leaks检测,重复上文查找内存泄漏的步骤,双击泄漏的地方,现在可以定位到代码部分

在这里插入图片描述

  1. 针对内存泄漏问题进行完善,并重复检查以尽量避免内存泄漏。

OC中的ARC和MRC

在OC语言中,ARC是自动引用计数机制,MRC是手动引用计数机制。ARC和MRC的区别在于,ARC会自动管理对象的生命周期,而MRC则需要程序员手动管理对象的生命周期。
如果在工程的Build Settings中搜索Automatic Reference Counting,可以找到该选项,该选项是YES,表示使用ARC。将Automatic Reference Counting设置为NO,表示使用MRC。

在这里插入图片描述

在本人实践中,通过Xcode创建的工程, Automatic Reference Counting默认为YES
但本人在实践中遇到,部分oc代码使用了ARC,仍然会发生内存泄漏,貌似ARC没起作用,使用手动释放内存后,发现内存泄漏减少了。这不符合预期的情况,使我一度非常疑惑。
经过不断检查,发现在本工程项目中的一个子工程中,Automatic Reference Counting的选项为NO。所以之前部分oc代码使用的是MRC,这也是为什么ARC没有起作用的原因。
将上述子工程的ARC启用后,发现内存泄漏的问题被解决。

上述实践也说明了在使用MRC时,如果程序员不能够很好地释放内存,将会发生内存泄漏。即使我使用MRC,并且手动释放,也没有释放干净,还是出现部分内存泄漏,这也是为什么现在都使用ARC的原因。它减少了我们对于内存管理的关注。

TIPS:上述没有默认启用MRC的子工程,是由Cmake生成的Xcode工程,可能其中有些设置和从Xcode创建的工程不同,所以导致了这样的问题。因此如果使用Cmake创建了Xcode工程,一定要确认工程设置正确,不止包括这个ARC的设置。

小结

本文主要由本人在实践中遇到的内存泄漏问题说起,介绍了Xcode中的内存泄漏工具Leaks,并进行了实践和内存泄漏位置定位。最后总结了本人在实践中遇到的一些关于内存泄漏的问题和注意事项。

参考文章

1分钟学会Instrument Leaks检测内存泄漏
iOS 内存泄漏检测 Instruments Leaks
iOS内存深入探索之Leaks

如果本文对你有帮助,请给我一个免费的赞,如果有错误,也欢迎向我反馈!

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

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

相关文章

Linux线程thread详解(线程池)

在我们的进程虚拟地址的代码区,对于代码中的每个函数都有对应的地址,每个函数中的每行代码都有对应的代码,并且每个函数中的每行代码的地址都是连续的。既然代码是连续的,也就意味着我们可以将我们代码分块,分成不同的…

机器学习笔记:序列到序列学习[详细解释]

介绍 本节我们使用两个循环神经网络的编码器和解码器, 并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务。遵循编码器-解码器架构的设计原则, 循环神经网络编码器使用长度可变的序列作为…

Jeecgboot3.6.3的vue3版本的一种flowable动态增加一个用户任务节点的方法(二)前端代码实现

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 这部分主要讲前端的功能实现 1、前端选择新增任务类型界面,点击新增节点 /*** 动态新增用户任务节点*/function handleAddTask(record: Recordable) {if (record.finishTime != null) {createMess…

在 .NET 8.0 中使用 xUnit 进行数据驱动测试

1. 前言 xUnit是一个功能强大且易于使用的单元测试框架。在.NET开发中,单元测试是非常重要的一部分,它可以帮助我们确保代码的正确性和可靠性。使用xUnit可以帮助我们编写更高效、更有效的单元测试,并提高代码质量和可维护性。 2. 特性 x…

Git-GitLab-Jenkins结合

目录 1.Git-GitLab-Jenkins结合2. 在pycharm配置git3. 实现提交代码后触发自动化测试(1)打开gitlab(2)Jenkins配置Git(3)选择需要的远程仓库 4.报告存在问题:5.也可以在Jenkins中设置定时触发&a…

OpenCV图像滤波(10)Laplacian函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 计算图像的拉普拉斯值。 该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值: dst Δ src ∂…

Elasticsearch:引入 Serverless 精简索引分片

作者:来自 Elastic Tanguy Leroux 在本文中,我们将介绍 Elasticsearch 的精简索引分片(thin indexing shards),这是我们为 Elastic Cloud Serverless 开发的一种新型分片,允许将 Elasticsearch 索引存储在云…

大数据技术现场工程师特色实训室解决方案

一、引言 在大数据时代背景下,数据已成为新的生产要素,驱动着各行各业的创新发展。面对这一趋势,市场对于既掌握大数据理论知识又具备实战能力的大数据技术人才的需求急剧增加。为了应对这一挑战,唯众精心设计了一套全面的大数据…

国产 麒麟 ARM 环境编译 RocketMQ-Client-CPP

1.环境 系统版本:Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux GCC: gcc (Ubuntu 9.3.0-10kylin2) 9.3.0 G: g (Ubuntu 9.3.0-10kylin2) 9.3.0 RocketMQ服务端版本:5.1.1 RocketMQ-cpp …

修改docker的/var/lib/docker/overlay2储存路径

目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…

RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!

一、引言 前面我们介绍过很多的关于大模型和RAG相关的技术,通过其关注程度足以看到市场上对RAG框架和成熟产品的迫切需求,因为想要个人独立从0开始实现一个RAG产品并非易事,虽然有相当多的RAG或者知识库开源产品,大部分其实很难应…

使用 Elasticsearch RestHighLevelClient 进行查询

Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…

Docker Hub 镜像代理加速

因为未知原因,docker hub 已经不能正常拉取镜像,可以使用以下代理服务来进行: "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud"…

深入浅出消息队列----【顺序消息的实现原理】

深入浅出消息队列----【顺序消息的实现原理】 何为顺序发消息的顺序性存储消息的顺序性消费消息的顺序性顺序消息消费的三把锁第一把锁:分布式锁第二把锁:Synchronized第三把锁:ReentrantLock 本文仅是文章笔记,整理了原文章中重要…

vue3仿飞书头像,根据不同名称生成不同的头像背景色

效果展示&#xff1a; 传递三个参数&#xff1a; name&#xff1a;要显示的名称&#xff1b;size&#xff1a;头像的大小&#xff1b;cutNum&#xff1a;分割当前名称的最后几位数&#xff1b; 代码如下&#xff1a; <template><div:style"{color: #fff,borde…

VMware虚拟机下安装Ubuntu22.04以及汉化配置保姆级教程

目录 一.VMware和Ubuntu下载 二.在VMware中创建Ubuntu 1.点击 创建新的虚拟机 2.选择典型 3.选择Ubuntu镜像包&#xff08;自定义存放的位置&#xff09; 4.创建个人信息&#xff08;密码一定要牢记&#xff09; 5.选择虚拟机的安装位置 6.其他配置项&#xff08;默认下…

在数字浪潮中扬帆远航,软件行业就业前景如何?

随着数字化转型的加速和信息技术的广泛应用&#xff0c;对于软件开发人员的需求持续增长。不仅传统IT企业需要大量的软件开发人才&#xff0c;各行各业的企业也普遍需要自主研发软件以满足其业务需求。对于具备较好的学习能力和适应能力的人来说&#xff0c;这个行业提供了更多…

jenkins一键推送到远程服务器并用docker容器启动

1.安装jenkins 我后端使用的是宝塔面板来安装的容器化jenkins,要选中允许外部访问&#xff0c;安装完之后没有那个选项了&#xff0c;一开始安装的时候要选中不使用域名和后面的允许外部访问。Jenkins 版本为&#xff1a; 2.462.1 2.配置Jenkins 2.1 Git plugin 安装完毕之…

江新安教授受邀引正基因进行《制药行业研发项目管理》培训

近日&#xff0c;科济管线创始人江新安教授应赛柏蓝邀请为北京引正基因科技有限公司&#xff08;简称引正基因&#xff09;进行《研发项目管理》授课。为提高项目管理水平&#xff0c;加强研发项目相关人员的管理能力&#xff0c;掌握研发项目管理技能与工具&#xff0c;江新安…

AI招聘在人才盘活中的作用:开启智慧人力新篇章

一、引言&#xff1a;AI赋能招聘新纪元 在21世纪的今天&#xff0c;随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到社会经济的各个角落&#xff0c;其中&#xff0c;人力资源管理领域也不例外。AI技术的引入&#xff0c;不仅颠覆了传统的招聘模…