IOS:代理delegate为什么要用assign或者weak

最近很多朋友问我代理为什么要用assign或者weak,很多人都知道是为了避免循环引用,但问其实质却并不了解。下面是我开发过程中对代理为什么要用assign或者weak的一些个人看法:

首先要明白内存管理,最主要的一点就是知道IOS的内存管理机制,就是任何对象里都有一个retainCount属性,一旦retainCount=0,那么该对象就会自动销毁,而strong或者iOS以前的retain,都会在引用对象时让retainCount+1,当retainCount不为零时,系统是不会销毁那个对象的。


所以请看下图


为什么会有一个delegate指向uiviewcontroller的强指针?原因很简单,因为我们一般代理的都是当前的控制器 比如scrollView.delegate = self;这时候就成了上面的一个圈的循环引用。

如果上图delegate为强指针,那么也就是说UIViewController和scrollView的retainCount 永远最少都为1,所以有强指针指向的那个对象就不会销毁,这就造成了内存泄露。

所以要想避免这种内存泄露,也就是避免像上述情况那种的循环引用,必须delegate为弱指针,这样,当UIViewContrller运行完自己的作用域要销毁时,发现没有强指针指向自己,并且retainCount=0,所以它就自动销毁了,而它指向的UIView也就没有了强指针指向,所以retainCount=0,所以也销毁了,这样NSArray也销毁了,最后scrollView也销毁了,就避免了内存泄露的问题。


以上观点属于个人见解,如有不足,请网友批评指正,如果还有不解的地方可以留言,我会及时回复。r

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值