UI 控件的属性用 strong 还是 weak?

xib 或 storyboard 中拖过来的控件

当我们从 xib 或者 storyboard 上拖控件到代码中的时候,我们会发现默认是用 weak 属性修饰的,当然还有一个 IBOutlet 前缀。例如:

@property (weak, nonatomic) IBOutlet UIButton *btn;

为什么这里要用 weak 修饰?

首先来看看 IBOutlet 有什么作用。IBOutlet 其实就是一个声明,它不做任何事情,仅仅表明该变量与界面的某个元素相连。

而这里使用 weak,则是因为在 xib 或者 storyboard 文件中已经对该控件形成了一个强引用。在将控件拖到 xib 或者 storyboard 上时,view 对它形成了一个强引用,那么在 viewcontroller 的代码文件中,它只需要弱引用这个控件就行了。

当 view 被释放,那么这个属性自然也就会被释放,控件生命周期与其拥有者保持一致。

事实上,当把 viewcontroller 拥有的 view 拖到代码文件中的时候,使用的是 strong 修饰。因为这个 view 正是被 viewcontroller 所拥有。

代码创建 UI 控件

那么,当我们不使用 xib 或者 storyboard 创建 UI 控件的时候,应该使用什么修饰符呢?

我们可以尝试一下 weak:

使用weak修饰 _userImageView

会产生如上警告,警告中说:object will be released after assignment. 对象将在分配后被释放。这是因为没有其他的强引用存在了,weak 指针自然会被释放。当然在此处,由于下面又使用了 addSubview 方法,对其加了一个强引用,所以也没有什么问题。但是在此处,还是推荐使用 strong 修饰符。

参考链接:

  1. 知乎:为什么 iOS 开发中,控件一般为 weak 而不是 strong?
  2. 探讨声明UI控件属性 什么时候用weak什么时候用strong
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容