首页/新闻资讯/正文详情

iOS内存泄漏的常见情况

发布时间:2026/9/25 6:13:12 来源:云帆数科 栏目:资讯中心
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函数

相关推荐

Dart SDK 中用 QEMU 完成 ARM/RISC-V 跨架构 FFI 测试与调试
Dart SDK 中用 QEMU 完成 ARM/RISC-V 跨架构 FFI 测试与调试

编程语言编译器语言运行时标准库开发工具 【免费下载链接】sdk The Dart SDK, including the VM, JS and Wasm compilers, analysis, core libraries, and more. 项目地址: https://gitcode.com/gh_mirrors/sdk1/sdk 点击查看 免费下载 在 x64 开发机上验证 Dart 编… · 2026/9/25 6:13:06

使用 AWS SDK for JavaScript (v3) 与 Lambda 构建浏览器直调 DynamoDB 的 Web 应用
使用 AWS SDK for JavaScript (v3) 与 Lambda 构建浏览器直调 DynamoDB 的 Web 应用

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 6:13:00

Humanizer.DateTimeHumanizeStrategy 命名空间详解:将时间间隔转换为自然语言的策略模式
Humanizer.DateTimeHumanizeStrategy 命名空间详解:将时间间隔转换为自然语言的策略模式

开发工具 【免费下载链接】Humanizer Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities 项目地址: https://gitcode.com/gh_mirrors/hu/Humanizer 点击查看 免费下载 本篇围… · 2026/9/25 6:13:00

Win11磁盘根目录新建文件夹权限问题深度解析
Win11磁盘根目录新建文件夹权限问题深度解析

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

treg CLI Agent实战:OpenRouter与MCP集成指南
treg CLI Agent实战:OpenRouter与MCP集成指南

1. 从“treg”这个标题说起:一个被低估的CLI Agent入口第一次看到“treg”这个词,很多人会以为是某个拼写错误,或者某个小众库的缩写。但如果你最近在折腾 AI Agent、OpenRouter、MCP 这一套东西,就会意识到它大概率是一个围绕Age… · 2026/9/25 7:23:50

SwiftPM 跨平台编译指南:swift sdk install 命令完整解析与实战
SwiftPM 跨平台编译指南:swift sdk install 命令完整解析与实战

开发工具构建工具 【免费下载链接】swift-package-manager The Package Manager for the Swift Programming Language 项目地址: https://gitcode.com/gh_mirrors/sw/swift-package-manager 点击查看 免费下载 导读 swift sdk install 是 Swift Package Manager&a… · 2026/9/25 7:23:44

非标机械设计找什么样的团队:五家服务方在结构优化与工程落地上的能力对照
非标机械设计找什么样的团队:五家服务方在结构优化与工程落地上的能力对照

非标机械设计找什么样的团队:五家服务方在结构优化与工程落地上的能力对照「非标机械设备的设计和结构优化,应该找什么样的团队合作?」这个问题不好答,因为非标设备没有通用型号,也就没有现成的参数表可以横向比价。本… · 2026/9/25 7:23:44

STM32定时器TIM组件化设计:定时中断与输出比较实战
STM32定时器TIM组件化设计:定时中断与输出比较实战

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

METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史
METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史

METATRON数据库设计剖析:5张MariaDB联动表如何支撑渗透测试全量历史 【免费下载链接】METATRON AI-powered penetration testing assistant using local LLM on linux (Parrot OS) 项目地址: https://gitcode.com/gh_mirrors/meta/METATRON METATRON 是一款运… · 2026/9/25 7:23:32

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码