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