IOS面試之為什么 iOS 開發(fā)中,xib跟storyboard拖得控件一般為 weak 而不是 strong

在OC中,如果對(duì)象沒有強(qiáng)引用,就會(huì)被自動(dòng)釋放,那么為什么控件還可以設(shè)為weak?

我們平時(shí)定義控件屬性的時(shí)候一般都會(huì)用strong修飾符,而我們?cè)谟脁ib,sb拖控件的時(shí)候會(huì)發(fā)現(xiàn),這時(shí)屬性都是用的weak修飾符。

    1. 從storyboard或者xib上創(chuàng)建控件,在控件放在view上的時(shí)候,已經(jīng)形成了如下的引用關(guān)系,以UIButton為例:
      UIViewController->UIView->subView->UIButton
      然后你為這個(gè)UIButton聲明一個(gè)weak屬性
      @property(nonatomic,weak) IBOOutlet UIButton *btn;
      相當(dāng)于xib/sb對(duì)這個(gè)Button是強(qiáng)引用,你聲明的屬性對(duì)它是弱引用。
  • 2.手動(dòng)創(chuàng)建控件

  • a). 將控件聲明成strong
    @property(nonatomic,strong) UIButton *btn;
    那么你在實(shí)現(xiàn)這個(gè)控件時(shí)只需這樣:
    _btn = [[UIButton alloc]init];
    [self.view addSubview:_btn]

  • b). 將控件聲明成weak
    @property(nonatomic,weak) UIButton *btn;
    那么你在實(shí)現(xiàn)這個(gè)控件時(shí)需要這樣:
    UIButton *button = [[UIButton alloc]init];
    _btn = button;
    [self.view addSubview:_btn];

  • 最近看的黑馬iOS視頻上給的建議的是:
    1.如果用Stroyboard拖線,用weak
    2.如果自定對(duì)象,用strong

    事實(shí)上IBOutlet的屬性一般可以設(shè)為weak是因?yàn)樗呀?jīng)被view引用了,除非view被釋放,否則IBOutlet的屬性也不會(huì)被釋放,另外IBOutlet屬性的生命周期和view應(yīng)該是一致的,所以IBOutlet屬性一般設(shè)為weak。

  • 下面我們來說說delegate為啥定義時(shí)要用weak修飾符,這個(gè)涉及到循環(huán)引用的問題。例如一個(gè)ViewController上通過強(qiáng)指針引用了一個(gè)tableview,tableview的datasource和delegate都必須是weak指針,因?yàn)関iewController被他兩指向,如果用strong的話,就會(huì)形成強(qiáng)引用循環(huán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容