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

Posted LoSenTrad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控件,代理为什么使用Weak?相关的知识,希望对你有一定的参考价值。

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

以上是关于控件,代理为什么使用Weak?的主要内容,如果未能解决你的问题,请参考以下文章

iOS关键词weak和assign的区别

iOS内存管理-- iOS 代理要用weak修饰

iOS 关于修饰代理用weak还是assign

(iOS) __block和__weak认识

strong ,weak,copy关键字使用,及weak跟assign区别

iOS strong与weak的使用