1. 什么是iOS内存泄漏与循环引用
当你发现手机越来越卡,或者App用着用着就闪退,很可能就是内存泄漏在作祟。简单来说,内存泄漏就是该释放的对象没被释放,像房间里堆满不再需要的快递盒。在iOS开发中,这通常由循环引用引起——两个或多个对象互相强引用,就像两个小朋友死死拽着对方衣角谁也不肯松手。
Swift的ARC(自动引用计数)机制本应自动管理内存:当对象的引用计数归零时,系统会自动回收内存。但遇到对象A强引用对象B,同时对象B又强引用对象A时,它们的引用计数永远无法归零,这就形成了保留周期。我曾在一个图片浏览器项目中,就因为ViewController和ImageLoader相互强引用,导致每次打开新页面内存就暴涨10MB。
常见的高危场景包括:
- 闭包默认强捕获:闭包内部使用self时,编译器不会提醒你加[weak self]
- 代理未声明为weak:Delegate属性默认是强引用
- 通知中心未移除观察者:iOS 9之前必须手动移除
- 定时器未销毁:Runloop会强持有target对象
2. 内存图调试器实战入门
Xcode的内存图调试器藏在调试栏第三个按钮(看起来像三个堆叠的圆圈),点击后会生成当前内存快照。左侧面板会显示所有存活对象,比如MainViewController(3)表示内存中有3个该控制器实例——这显然不正常,因为同一时刻应该只有一个活跃控制器。
关键操作技巧:
- 紫色感叹号标记自动检测到的泄漏对象
- 灰色虚线表示弱引用,实线表示强引用
- 右键对象可查看保留路径(谁在引用它)
- 按住Option点击引用线可查看引用属性名
我曾用这个工具发现一个诡异现象:退出页面后仍有AVPlayer


694

被折叠的 条评论
为什么被折叠?



