iOS开发-循环引用

本文介绍了iOS开发中循环引用的概念,包括循环引用产生的原因和可能导致循环引用的三个常见场景:delegate、NSTimer和block。对于每个场景,文章详细解释了问题的本质,并提供了相应的解决方案,如使用weak修饰符、避免在block内直接使用self等。最后,文章讨论了使用weakSelf和strongSelf的技巧,并提出了宏定义的优化建议,以防止循环引用的发生。
摘要由CSDN通过智能技术生成

一、循环引用的产生

-- :表示弱引用。

-> :表示强引用。

循环引用可以简单理解为对象A引用了对象B,而对象B又引用了对象A:A -> B -> A,此时双方都同时保持对方的一个引用,导致任何时候双方的引用计数都不为0,双方始终无法释放就造成内存泄漏。

当然不只是两个对象之间相互引用会形成循环引用,多个对象之间相互引用最终形成环同样会形成循环引用。

例如:A -> B -> C -> A。

二、容易造成循环引用的三个场景

1、delegate

self.tableView.delegate = self;

如果 delegate使用strong修饰就会构成循环引用:self -> tableView -> delegate -> self。

所以在定义delegate属性时使用weak便能解决这一问题:self -> tableView -- delegate -> self。tableView和delegate之间不是强引用,所以构不成循环。

规避delegate循环引用的杀手锏也是简单到哭:定义delegate属性时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong。

2、NSTimer

详情看我的这篇博客:iOS开发-NSTimer探究

3、block

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值