控件,代理为什么使用Weak?

来源:互联网 发布:jo抢购软件下载 编辑:程序博客网 时间:2024/05/16 15:00

好多初学者都很不明白,控件,代理为什么要使用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];这样子对象一创建出来就会被销毁了
0 0
原创粉丝点击