代理属性为何要用 weak 修饰?
2017-10-19 11:25
239 查看
代理模式在 IOS 开发中的使用频率非常之高,然而很多人只是单纯地惯性使用,并没有弄清楚一点——要用 weak 修饰代理属性,今天就来细说这其中的缘由。
用一个实例进行说明(一共有三个类,BabyView 类,BabySitterView 类,ViewController 类,假设 BabyView 类想要做一些自己无法做的事情,就必须具有代理的属性,因此指定一个协议,而 BabySitterView 需要成为 BabyView 的代理,必须遵循协议,直接上代码截图):
BabyView 类:
BabySitter 类:
ViewController 类:
若使用 weak 修饰代理属性,则控制台打印输出为:
表示对象被顺利地销毁,调用了 Baby 类和 BabySitter 类的 delloc 方法,若使用 strong 修饰代理属性,则控制台没有打印,这表明造成了循环引用,对象不能正常释放。
图解:
若用 weak 修饰代理属性,则不会造成循环引用,而如果换为 strong 修饰代理属性,则图中的 BabyView 类向 Delegate 的连线由虚线变为实现,会造成循环引用,导致内存泄露。
代理属性为何要用 weak 修饰?
一句话来解决这个问题,就是为了避免循环引用。
用一个实例进行说明(一共有三个类,BabyView 类,BabySitterView 类,ViewController 类,假设 BabyView 类想要做一些自己无法做的事情,就必须具有代理的属性,因此指定一个协议,而 BabySitterView 需要成为 BabyView 的代理,必须遵循协议,直接上代码截图):
BabyView 类:
BabySitter 类:
ViewController 类:
若使用 weak 修饰代理属性,则控制台打印输出为:
表示对象被顺利地销毁,调用了 Baby 类和 BabySitter 类的 delloc 方法,若使用 strong 修饰代理属性,则控制台没有打印,这表明造成了循环引用,对象不能正常释放。
图解:
若用 weak 修饰代理属性,则不会造成循环引用,而如果换为 strong 修饰代理属性,则图中的 BabyView 类向 Delegate 的连线由虚线变为实现,会造成循环引用,导致内存泄露。
代理属性为何要用 weak 修饰?
一句话来解决这个问题,就是为了避免循环引用。
相关文章推荐
- iOS中代理属性为什么要用Weak修饰?
- iOS中代理属性用Weak修饰
- iOS中代理属性为什么要用Weak修饰?
- 更新至Xcode7.3后 使用__weak 修饰的属性出现unavailable 的问题
- ios UI控件引用用weak,UI控件代理属性必须用weak
- IOS属性(@property)的修饰词assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite解释、以及一部分内存优化方法
- oc——类——属性——修饰词——assign retain copy strong weak unsafe_unretained
- iOS 关于修饰代理用weak还是assign
- iOS 关于修饰代理用weak还是assign
- delegate 作为属性,为什么要用weak修饰?
- iOS 关于修饰代理用weak还是assign, strong
- 关于ARC下修饰代理用assign还是weak
- iOS内存管理(3)-- iOS 代理要用weak修饰
- iOS 为什么要用weak修饰代理(delegate)
- delegate 作为属性,为什么要用weak修饰?
- iOS - Delegate代理为什么要用weak修饰(面试官钟爱)
- iOS 代理为啥要用weak修饰? (刨根问底一)
- iOS开发-修饰代理delegate用weak还是assign?
- iOS 代理为啥要用weak修饰? (刨根问底一)
- iOS 代理为啥要用weak修饰? (刨根问底一)