新闻详情

新闻详情

首页 / 资讯中心 / 详情

iOS内存泄漏的常见情况

发布时间:2026/9/28 10:14:59来源:尧图网络
iOS内存泄漏的常见情况
最近面试了一波有个内存泄漏的问题现在回顾一下首先概念我之前有点不明确吧面试的时候回答的有点含糊由于朋友内推去面试的也算蒙混过关了~内存溢出用户要求系统分配的内存空间超出了系统所能提供的范围称内存溢出内存泄露用户向系统申请内存new使用完后没有释放的情况delete导致了该块内存不能再被用户使用也不能被系统调用。我们常说的内存泄露指的是堆泄露内存越界使用已申请的内存时超出了内存的界限。栈溢出栈满时再做进栈必定产生空间溢出叫上溢栈空时再做退栈也产生空间溢出称为下溢。ps典型的在C语言中在分配数组时为其分配的长度是1024但往其中装入超过1024个数据时由于C语言不会对数组操作进行越界检查就会造成内存溢出错误。出现死循环或者是大量的递归调用在不断的压栈过程中造成栈容量超过1m而导致溢出。栈溢出解决方法方法一用栈把递归转换成非递归通常,一个函数在调用另一个函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数的入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控制转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是数据,都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必要的数据以减少系统负担。方法二使用static对象替代nonstatic局部对象在递归函数设计中可以使用static对象替代nonstatic局部对象即栈对象这不仅可以减少每次递归调用和返回时产生和释放nonstatic对象的开销而且static对象还可以保存递归调用的中间状态并且可为各个调用层所访问。方法三增大堆栈大小值当创建一个线程的堆栈时系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是当调用CreateThread或_beginthreadex函数时可以重载原先提交的内存数量。这两个函数都有一个参数可以用来重载原先提交给堆栈的地址空间的内存数量。如果设定这个参数为0那么系统将使用/STACK开关指明的已提交的堆栈大小值。后面将假定我们使用默认的堆栈大小值即1MB的保留区域每次提交一个页面的内存。之后回归主题再说一下iOS内存泄漏的常见情况1.声明delegate为strong类型简而言之如果父VC持有子VC并设置子VC的delegate为self也就是父VC这样的结果就是子VC也间接持有了父VC造成循环引用在Pop子VC的时候不会调用delloc。2.timer是否持有self我们一般要执行一个timer的时候会用(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo 这里的aTarget一般是self这时候就需要注意了如果在你退出的时候这个timer还在执行的话由于这个timer会持有self所以delloc也不会调用这里可以用weakSelf代替self也是没有问题的。3.最常见的就是block导致的循环引用由于在重构APP中用到了MVVM架构使用了大量的信号机制导致block到处飞哈哈解决的最多的就是这种了解决方法也很简单就是在block外声明__weak type(self) weakSelf self在block中用weakSelf就可以了还有就是在block中如果使用了成员变量的下划线形式也要改成weakSelf.PropertyName的形式。MVVM中定义了宏对weakify(self)和strongify(self)可以理解为__weak type(self) weakSelf self的简化形式可以拿来直接使用。3.图片没释放instrument调试后发现没被释放的全是imageIO差不多就知道了把读图的方式从[UIImage imageNamed:],改成imageWithContentsOfFile就可以了。4.使用GPUImage处理拍照的时候内存稳定不明增长。是Xcode7.1的问题。。只在debug的时候导致内存崩溃release的时候并不会造成内存溢出所以可以不必管它。5.CoreFoundation对象(C对象) : 只要函数中包含了create\new\copy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次CFRelease或者其他release函数
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 2026/9/28 9:42:31

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 网站做好了没人访问,这是很多老板最头疼的事。你花大价钱做的官网,设计精美、功能齐全,但打开一看,流量为零,咨询为零。这时候你才意识到,问题不在“做没做”,而在“怎么快速做出来并推向市场”。面…

阅读更多 →
昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践 2026/9/28 9:42:24

昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践

昇腾910B上跑DeepSeek多机分布式推理,很多人卡在第一眼:MindIE、HCCL、ranktable、hccn_tool,每个词都眼熟,串起来就不是那么回事。实际踩过一圈之后你会发现,真正决定能不能跑起来的不是模型代码,而是通信…

阅读更多 →
从CANoe到TSMaster:车载总线测试工具链迁移实战指南 2026/9/28 9:42:24

从CANoe到TSMaster:车载总线测试工具链迁移实战指南

搞车载总线测试的工程师,电脑里大概率都装着一套CANoe。我最早接触CANoe是刚入行那会儿,跟着前辈在项目里做网络测试,从报文发送、DBC解析到UDS诊断,基本全是靠Vector这套工具撑起来的。说实话,CANoe确实是这个行业的标…

阅读更多 →
从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地 2026/9/28 9:42:23

从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地

1. 日榜的"热度"到底是怎么算出来的先别急着收藏仓库。每天打开 GitHub 的 Trending 页面,你看到的是过去 24 小时内 Star 增量最高的仓库,周榜和月榜则分别看一周、一个月内的增量。官方没有公开完整排序算法,但用久了会发现&…

阅读更多 →
【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架 2026/9/28 9:42:23

【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南 2026/9/28 9:42:23

OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南

模型评测人工智能大模型AI 评测 【免费下载链接】opencompass OpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, scie…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉