xib 或 storyboard 中拖過來的控件
當(dāng)我們從 xib 或者 storyboard 上拖控件到代碼中的時候炼鞠,我們會發(fā)現(xiàn)默認(rèn)是用 weak 屬性修飾的,當(dāng)然還有一個 IBOutlet 前綴虾宇。例如:
@property (weak, nonatomic) IBOutlet UIButton *btn;
為什么這里要用 weak 修飾搓彻?
首先來看看 IBOutlet 有什么作用。IBOutlet 其實(shí)就是一個聲明嘱朽,它不做任何事情旭贬,僅僅表明該變量與界面的某個元素相連。
而這里使用 weak搪泳,則是因?yàn)樵?xib 或者 storyboard 文件中已經(jīng)對該控件形成了一個強(qiáng)引用稀轨。在將控件拖到 xib 或者 storyboard 上時,view 對它形成了一個強(qiáng)引用岸军,那么在 viewcontroller 的代碼文件中奋刽,它只需要弱引用這個控件就行了瓦侮。
當(dāng) view 被釋放,那么這個屬性自然也就會被釋放佣谐,控件生命周期與其擁有者保持一致肚吏。
事實(shí)上,當(dāng)把 viewcontroller 擁有的 view 拖到代碼文件中的時候狭魂,使用的是 strong 修飾罚攀。因?yàn)檫@個 view 正是被 viewcontroller 所擁有。
代碼創(chuàng)建 UI 控件
那么雌澄,當(dāng)我們不使用 xib 或者 storyboard 創(chuàng)建 UI 控件的時候斋泄,應(yīng)該使用什么修飾符呢?
我們可以嘗試一下 weak:
會產(chǎn)生如上警告镐牺,警告中說:object will be released after assignment. 對象將在分配后被釋放炫掐。這是因?yàn)闆]有其他的強(qiáng)引用存在了,weak 指針自然會被釋放睬涧。當(dāng)然在此處募胃,由于下面又使用了 addSubview 方法,對其加了一個強(qiáng)引用宙地,所以也沒有什么問題摔认。但是在此處逆皮,還是推薦使用 strong 修飾符宅粥。
參考鏈接: