在OC中,如果對(duì)象沒有強(qiáng)引用,就會(huì)被自動(dòng)釋放,那么為什么控件還可以設(shè)為weak?
我們平時(shí)定義控件屬性的時(shí)候一般都會(huì)用strong修飾符,而我們?cè)谟脁ib,sb拖控件的時(shí)候會(huì)發(fā)現(xiàn),這時(shí)屬性都是用的weak修飾符。
- 從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ì)它是弱引用。
- 從storyboard或者xib上創(chuàng)建控件,在控件放在view上的時(shí)候,已經(jīng)形成了如下的引用關(guān)系,以UIButton為例:
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)。