IOS:代理delegate为什么要用assign或者weak
2015-08-19 15:24
246 查看
最近很多朋友问我代理为什么要用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
首先要明白内存管理,最主要的一点就是知道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
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- Query中click(),bind(),live(),delegate()的区别
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery中delegate与on的用法与区别示例介绍
- JS delegate与live浅析
- jQuery事件 delegate()使用方法介绍
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- .NET笔记之:Delegate内部原理的分析
- 探讨Android与iOS,我们将何去何从?