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

本文探讨了在iOS开发中,为什么控件(如从Storyboard拖线)和代理(如UITableView的delegate)通常使用weak属性。苹果官方建议使用weak以避免内存泄露,因为控件与控制器视图之间可能存在强引用循环。当控制器销毁时,若控件使用weak,可以确保视图及其控件一同被释放,防止循环引用导致的内存泄露。对于自定义控件,由于需要保持其生命周期,通常使用strong属性进行修饰。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值