好多初学者都很不明白,控件,代理为什么要使用weak,主要有以下几个问题:
- 控件(SB中拖线)为什么要使用weak
- 代理为什么使用weak(比如系统内置类UITableView的的delegate)
1.apple官方是建议我们控件从Storyborad拉线的时候要使用weak,至于为什么要使用weak,
原因是这样的:
控件放在storyborad中,表示控制View强引用着这个控件,而此时如果控件使用strong修饰而
不使用weak修饰,会造成的问题就是内存泄露.
那么内存是怎么泄露的?如图所示:
分析:控制器强引用这控制器View,View强引用控件,如果控件使用strong修饰,就相当于控件
,此时就会造成内存泄露!如果用weak修饰,当控制器销毁,View强引用控件,而控件弱引用View,
当控制器销毁,这两者就会真正销毁!(在ARC中,当一个对象没有被强指针引用的时候,那么这个
对象就要释放),
以上内存释放的过程是这样子的:
当控制器销毁的时候(假设导航栏推出一个新的控制器),此时控制器View没有被控件弱引用(控件用
weak),所以控制器View也要跟着销毁,同理控件没有View的强引用(View销毁了)之后,也跟着销毁.
这样就达到了内存释放!
以上分析也可以解释为什么delegate要是weak而不使用strong,防止循环引用,造成内存泄露!
2.当我们自己创建的控件的时候,为什么要使用strong.
原因很简单:ARC中的内存管理中,当一个对象没有强引用的时候那就会被释放,所以只能用strong修饰.
实例:
//创建一个button,如果用weak修饰
@property (nonatomic,weak) UIButton *btn
//实例化对象
_btn = [[UIButton alloc] init];这样子对象一创建出来就会被销毁了