iOS自问自答:总结内存管理与优化

本文探讨了在ARC环境下如何避免内存泄露,包括检测和处理循环引用,以及内存优化策略。详细介绍了__block的使用场景,防止APP崩溃的措施,如处理消息转发和僵尸对象,以及线上Bug的定位方法。提供了实用的工具和最佳实践。
摘要由CSDN通过智能技术生成

目录

  1. ARC下如何避免内存泄露?如何检测?
  2. 你是如何做内存优化的?
  3. __block你知道多少?在什么时候使用?
  4. 关于防止APP崩溃你做了哪些努力?
  5. 你是如何做线上Bug定位的?
  6. 关于经验和技巧还有什么想说的?

1. ARC下如何避免内存泄露?如何检测?

  • 避免:
    • 注意使用block时是否造成循环引用,使用__weak 配合 __strong关键字打破闭环

      不是所有的block都要避免循环引用。所谓“循环引用”,指的是双向的强引用(即self强引用block,block也强引用self),单向的强引用则不用担心,系统的某些block api(如UIView的block版本写动画)或者第三方库如MJRefreshSDWebImage等未形成闭环均不用考虑循环引用问题。

    • delegate使用weak声明比assign好,因为使用weakdelegate成员变量会在持有者销毁时自动被赋为nil对象回收时Weak指针自动被置为nil的实现原理,典型应用:一句话移除所有通知 [[NSNotificationCenter defaultCenter] removeObserver:self];),此时向空对象发消息objc_msgSend(obj, @selector(methodName:)判断obj为 nil 则selector也为 nil 从而直接返回 0(nil) 而不会引起crash
    • 注意CoreFoundation对象的使用,使用完成后记得主动调用相应的CFRelease()方法
    • 例如NSTimer加入到Runloop中,界面消失时记得将定时器销毁,建议使用NSTimer的分类(如YYKit的NSTimer+YYAdd),并在dealloc中调用[timer invalidate]停止定时器
  • 检测:

检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具FBRetainCycleDetector,这里有两篇很棒的文章翻译并介绍了它的相关用法:
[译文]在iOS上自动检测内存泄露
FBMemoryProfiler 基础教程

  • 使用Xcode -> Product -> Analyze 分析memory警告,可以发现局部变量忘记release的情况(或者申请了内存却未使用)
  • 在Xcode -> Debug area中点击Debug Memory GraphDebug View Hierarchy按钮,在Debug navigator区查看紫色感叹号情况,缺点是每个屏幕都要点击一下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值