iOS内存泄露查处

XZ_iOS之"User-facing text should use localized string macro”警告的解决 "User-facing text should use localized string macro”警告的解决 阅读详情

虽然iOS 5.0版本之后加入了ARC机制,但由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。

这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用。

本文假设你已经比较熟悉Obj-C的内存管理机制。

实验的开发环境:XCode 4.5.2

1、运行Demo。

先下载一个实现准备好的内存泄露的Demo吧:

leak app

下载下来,打开运行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。崩溃截图:

在崩溃的地方断住了,知道crash的地方了,但是不知道具体crash的原因。

2、设置NSZombieEnabled

这是一个 “EXC_BAD_ACCESS”错误。我们打开XCode的选项:“NSZombieEnabled” 。在crash时可能会给你更多的一些提示信息。

设置步骤:1

2:勾上红色框里的

运行,按刚才的操作选中其中的cell。再次crash,这次在output窗口会看到多了一项错误信息:

2012-11-28 13:22:08.911 PropMemFun[2132:11303] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x713ebc0

大概意思是:向已释放的内存发送消息。也就是说使用了已释放的内存,在C语言相当于使用了“野指针”

看了下crash的这个语句,sushiString应该是没问题的,它是从stringWithFormat初始化出来的。那就是_lastSushiSelected的问题。

_lastSushiSelected指向了sushiString,sushiString是一个autorelease变量。 在第二次点击时,使用的是sushiString已经被释放,所以crash了。那为_lastSushiSelected保留一下,就可以用了。代码修改如下:

<span style="font-size:14px;">    _lastSushiSelected = [sushiString retain]; 

</span> 

运行,这时候不崩溃。

3、分析内存泄露(shift+command+b)

app不crash了,那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露

分析之后可以看到:

这里提示alertView没被释放,有内存泄露,那我们释放

    [alertView release];

再分析,这个问题解决了。

4、使用Instruments的leaks工具

分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。

 

按上面操作,build成功后跳出Instruments工具,选择Leaks选项,这时候寿司程序也运行起来了,选中list中的项,拖动等操作后,工具显示效果如下:

大家可能都能猜到,红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢?

先在工具栏按下红色的圆形按钮,把工具监视内存的活动停下来。选择Leak,然后点中间十字交叉那,选择Call Tree

这时候左下角的Call Tree的可选项可以选了。选中Invert Call Tree 和Hide System Libraries,显示如下:

这时候内存泄露的具体代码找到了,在右边的红色框框里指定了哪个方法出现了内存泄露。

你只要在这些方法上双击,就会跳转到具体的代码,哈哈,是不是很方便。

这里应该是提示100%内存会泄露。

6、解决内存泄露问题

问题找到了,那就解决吧。

关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:

sushiString变量通过autorelease创建,它的引用计数是1.   

这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];

这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1

当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,产生了内存泄露。

怎么解决呢?

在_lastSushiSelected = [sushiString retain];之前把原来的release就ok了:

[_lastSushiSelected release];   

    _lastSushiSelected = [sushiString retain];   

关于:tableView:cellForRowAtIndexPath

这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:

NSString *sushiString = [NSString stringWithFormat:@"%d: %@", indexPath.row, sushiName];  
 
好了,泄露都fix了,再用工具分析看看,这时候你再点,再拖,再怎么操作,都没有内存泄露了。表明内存泄露被堵住了。

这是本文修复好的app代码:

no Leak App
Xcode Instruments性能分析工具 Xcode Instruments 是一款功能强大的性能分析工具,能够帮助开发者深入了解 iOS 和 macOS 应用的性能表现。尽管它在使用上存在一些限制,如仅限于 macOS 和证书管理繁琐等,但其提供的详细函数耗时堆栈和内存分配分析功能,使其成为开发者进行性能调试和优化的重要工具。通过合理使用 Instruments,开发者可以有效识别和解决应用中的性能瓶颈,从而提升用户体验。 阅读详情

相关推荐

Xcode 使用 Instruments 无法找到代码中耗时挂起操作的解决

在本篇博文中,我们讨论了 Xcode 如何使用 Instruments 探查 App 代码中的性能瓶颈,无论何种耗时挂起操作我们都能快速揪出它们!

享受开发,颠倒银河 1538

使用Xcode和Instruments调试解决iOS内存泄露

        虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。 这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用。 本文假设你已经比较熟悉Obj-C的内存管理机制。 实验的开发环境:XCode 4.5.2 1、运行Demo。 先下载一个实现准...

空杯子 19万+

Xcode Instruments:使用CustomInstrument进行自定义性能监控_2024-07-23_07-52-23.Tex

在开始创建自定义的Instruments监控工具之前,首先需要确保你的Xcode项目已经正确设置。这包括创建一个新的Xcode项目或在现有的项目中进行配置。打开Xcode并创建新项目选择“File” > “New” > “Project”。选择“Application”下的“Single View App”,点击“Next”。填写项目信息,如产品名称、组织名称、组织标识符等,然后选择保存位置,点击“Create”。添加Swift或Objective-C支持。

871

Xcode调试工具Instruments指南

前段时间去国内一家知名的互联网公司应聘高级iOS开发工程师,当时面试时被问到了Instruments,由于平时深入使用的不多,所以被pass掉了。因此决定找时间深入了解一下。主要途径是参考苹果官方文档,所以介绍以翻译官方文档为主。由于内容比较多,会分阶段来介绍。 以下来自苹果官方文档中对Instruments描述介绍Instruments是一个强大而灵活的性能分析和测试工具,它是Xcode开发工具

GGGHub的博客 2万+

瑞芯微RK3506开发板Ethercat主站性能优化实战:从内核配置到微秒级延迟控制

本文详细介绍了在瑞芯微RK3506开发板上实现EtherCAT主站微秒级延迟控制的实战优化方案。核心在于部署Preempt-RT实时内核,并进行深度系统调优,包括CPU隔离、中断亲和性设置、内存锁定及电源管理调整。通过绕过Linux网络栈的专用驱动加载与配置,最终实现了稳定的高性能实时控制,满足工业自动化需求。

tcp8optimizer的博客 315

使用Wireshark抓取用户在网站的登陆密码

(POST请求是浏览器向服务器提交数据的方式,我们的用户名和密码就是这样提交出去的),单击点开,发现我们的账号和密码,就被抓取到了,在。(注意哦,要去掉http和/,比如http://www.4399.com/,我们只需要记下4399.com即可)(这句话是筛选数据,就是只显示IP为我们要抓取网站的数据) ,点击右边的蓝色箭头。这就是Wireshark简单的抓取登录密码的教程,只适用于http协议的网站。”打开,是这个样子,上面的数据先不用管,我们先点击左上角红色的方块停止抓包。,然后回车,得到的IP为。

泡泡的博客 1万+

iOS基础 - 内存分析

一、内存的重要性 程序是否可用的最根本的制约因素。 十分影响用户体验。 程序的crash有很多情况都是内存的原因。 二、iOS平台内存警告机制 iOS系统不支持虚拟内存,一旦出现内存不足的情况,iOS系统会通知所有app,无论是前台的还是挂起的,都会收到memory warning的通知,一旦app收到memory warning的通知就应该回收占用内存较大的对象。 内存警告测试方法:

765

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

iOS内存管理之超级大坑-内存泄漏

除了ARC和MRC混合,有时候还有很多底层库是使用C/C++实现的,而且这些库中也涉及一些OC方面的库类调用,这样的情况就又复杂一点了。 = =,所以C/C++的内存管理也是需要有所了解滴~~~

骑着蜗牛找马儿 6676

PMSM无感foc控制(滑模-反正切-PLL)【仿真模型搭建教程】(附模型)

本文主要目的是教大家如何把文献中的公式转换成仿真模型。 首先介绍滑模控制的原理及如何搭建simulink模型。 1.1基于反电势估计位置原理 永磁同步电机在静止坐标系αβ下的电压方程: 扩展反电动势包含转子位置信息,并且αβ轴下扩展反电动势的反正切函数正好就等于位置角theta。 1.2 滑模控制原理(比较重要的点是以电机电流模型推导展开) 通过滑模观测得到鲁棒性比较高的αβ轴下扩展反电动势,并求其反正切函数,得到位置信息。 /*********************...

weixin_44769876的博客 1万+

Python实战:3步搞定视频去重,告别重复文件烦恼(附完整代码)

本文提供了一套基于Python的视频去重实战方案,通过三步流程(抽帧、生成内容指纹、相似度比对)高效识别重复视频文件。文章详细介绍了使用dHash算法生成视频指纹的核心原理,并提供了完整的代码实现,帮助用户快速构建自己的视频去重工具,告别重复文件管理烦恼。

weixin_29054245的博客 379

Instruments使用指南(二)--- 开始Instruments之旅

Launch InstrumentsInstruments应用程序存在于Xcode应用程序中,所以最直接的启动方式是在Xcode中。 您也可以通过Dock,Launchpad或命令行间接启动它。Launch Instruments from Xcode启动instruments的最直接的方式从xcode菜单栏里启动.xcode菜单栏启动步骤:打开xcode选择 Xcode &gt; Open De...

星宇大前端 4602

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2208

Xcode一些Analyze分析的错误

1.错误:User-facing text should use localized string macro 给label赋值的时候,提示 面向用户的文本应该使用本地化的字符串宏 此为代码中配置了本地化,面向用户的应该用字符串宏,而我们直接赋值为汉字. 解决方法: 2.Property of mutable type ‘NSMutableArray’ has ‘copy’ attribute...

iOS_ZCP的博客 513

Unity WebView 插件⭐️(十八)3D WebView 原生2D模式 — Native 2D Mode

Unity中的 浏览器插件:3D WebView,利用好该插件我们可以自己使用Unity打造出一个自定义的多样化浏览器。可以用于2D显示,也可以用于3D空间场景中使用,在PC端、手机端和VR设备等都可以有一个非常好的效果。一起来浏览器插件:3D WebView的专栏学习使用吧!

努力前行,总会成为自己心中的那道光 7640

手把手教你从入门到精通C# Modbus通信

本文是《Modbus通信从入门到精通》的导读,本专栏将会详细介绍ModusRTU 、ModbusASCII、ModbusTCP这三种协议的C#实现,由一个高级工程师多年实战经验总结而成,绝对干货!

qq_34059233的博客 1万+

Analyze 分析内存 检测出现 User-facing text should use localized string macro 警告问题

早期项目最低适配ios7,后来将最低适配修改为iOS8,在检测内存泄漏时出现几百个“User-facing text should use localized string macro”警告; // ==》面向用户的文本应该使用本地化的字符串宏(此为代码中配置了本地化,面向用户的应该用字符串宏,而我们直接赋值为汉字,因此,此提示可以忽略.) 如何屏蔽:

lanceses的专栏 2621

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ios开发之内存泄漏和性能优化

什么是内存泄漏? 本应释放的内存没有释放,导致可用空间减少的现象。(摘自百度知道,看你敢不敢信) 举个例子:你dismiss了一个视图控制器,但是最终却没有执行这个视图控制器的dealloc方法。 目前遇到的导致内存泄漏比较严重的有这几个地方: 一.delegate 不知为何之前那个开发者全部用的retain修饰符,导致很多应该释放的视图控制器都没释放。这个修改很简单:将retain改成

程序小痴的博客 3319

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

iOS10检查内存泄漏时出现的问题以及解决办法--Analyze检测的User-facing text should use localized

检测内存泄漏时出现泄漏提示:User-facing text should use localized string macro。 静态内存分析由于是编译器根据代码进行的判断, 做出的判断不一定会准确, 因此如果遇到提示, 应该去结合代码上文检查一下。 // 面向用户的文本应该使用本地化的字符串宏 1.user-facingtextshould use localizedstringmacr

Flying_in_the_world的专栏 1381

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mac平台Instrument游戏性能分析工具

使用 Instruments 对游戏的内存情况进行分析,可以帮助开发者识别内存使用的热点、检测内存泄漏,并提供优化建议。通过合理的内存管理和优化,开发者可以提升游戏的性能和用户体验。Instruments 是一个功能强大的性能分析工具,其底层原理涉及数据采集、分析、可视化和插件架构等多个方面。通过这些机制,Instruments 能够帮助开发者深入了解应用程序的性能表现,识别和解决潜在的问题,从而提升应用程序的质量和用户体验。Instruments 的架构设计旨在提供高效、灵活和可扩展的性能分析工具。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 2633

iOS应用性能优化: Instruments工具使用指南

Instruments是苹果官方提供的一款性能分析工具,它支持多种性能指标的监控,如CPU使用率、内存占用、磁盘I/O、网络流量等。通过使用Instruments,开发者可以直观地了解应用在运行过程中的性能表现,从而有针对性地进行优化。多维度监控:能够监控多种性能指标,全面分析应用性能。实时分析:提供实时数据,方便开发者快速定位问题。可视化展示:以图表形式展示数据,便于开发者理解。Instruments工具是iOS应用性能优化的有力助手。

2501_92585563的博客 1235

使用Xcode8的Instruments检测解决iOS内存泄露(leak)

在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原因,还是会出现内存泄露的问题.内存泄露是一个很严重的问题.下面就简单介绍下怎么使用Xcode8自带的Instruments中的Leaks检测我们的程序有没有内存泄露和定位内存泄露...

807

iOS Instruments性能分析工具深入解析(42)

Instruments是Xcode开发工具套件中一个强大的性能分析工具集,它为开发者提供了全面的应用性能监控和分析能力。通过Instruments,开发者可以深入了解应用在运行时的行为,识别性能瓶颈,优化代码,提高应用的响应速度、稳定性和资源利用率。

Android开发领域创作者 1794

iOS:Xcode Instruments的使用

WWDC视频: WWDC2019:Developing a Great Profiling Experience WWDC2019:Modeling in Custom Instruments 苹果官方文档: Apple Developer: Instruments Help

baidu_40537062的博客 2887

应用服务器发生 hang 的诊断方法

应用服务器发生 hang 的诊断方法

蜡笔小辛的专栏 4100
上一篇: XCode GDB常用命令使用
下一篇: SDWebImage
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值