UI控件和代理为什么使用weak

1.@property属性的用法
* weak(assign) : 代理\UI控件
* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)
* copy : 字符串
* assign : 非对象类型(基本数据类型int\float\BOOL\枚举\结构体)

2、UI控件为什么使用weak
(1)UI控件即可以使用weak,也可以使用strong,但是没有必要使用strong;(注:UIWindow 常用strong,因为它没有下面view的特点)
(2)retain 是iOS5之前的,相当于strong,都是强指针;assign相当于weak,都是弱指针;
(3)如下图所示:ViewController内有一个自带的view属性,指向内存中的view对象,同时在ViewController内自定义一个btn属性;
view对象内部有一个subviews属性,指向内存中的一个数组,该数组内存放的是一些索引,索引内存放的地址,对应的是添加到subviews内的对象,由图可见,btn是weak还是strong,对Button对象没有影响,即没有btn属性,Button对象也能存在,因为只要控制器在,控制器内的view就在,view在,view内的subviews属性就在,subviews属性在,其对应的索引数组就在,索引数组在,那么Button对象肯定存在;所以可以得到一个结论:只要控制器在,控制器view内部的子控件就都在;所以一般对 UI控件使用weak,因为弱指针相对于强指针有一些好处,比如,weak指针在没用时,会自动清空,空指针不会有内存泄漏;
UI控件和代理为什么使用weak_第1张图片

3、代理为什么使用weak?
以UITableViewController为例,该控制器内部有一个tableView属性,该属性指向一个UITableView对象,UITableView 内又有两个属性:delegate和dataSource,都是assign,即弱指针,以delegate为例,而且一般UITableView的代理就是UITableViewController控制器;
如下图,若两条线都是强指针,会引发循环引用的问题,造成内存泄漏;
UI控件和代理为什么使用weak_第2张图片
所以,一般代理都使用weak,即如下图,一强一弱,不会引发循环引用的问题,当然也不会造成内存泄漏;
UI控件和代理为什么使用weak_第3张图片
结论:一般,控件的代理都是控制器,而控制器又拥有着该控件,所以,为了不引发循环引用的问题,代理一般都使用weak;

你可能感兴趣的:(UI,对象,控件)