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指针在没用时,会自动清空,空指针不会有内存泄漏;
这里写图片描述

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值