在OC中,如果對象沒有強引用,就會被自動釋放,那么為什么控件還可以設(shè)為weak?
我們平時定義控件屬性的時候一般都會用strong修飾符,而我們在用xib,sb拖控件的時候會發(fā)現(xiàn),這時屬性都是用的weak修飾符。
- 從storyboard或者xib上創(chuàng)建控件,在控件放在view上的時候,已經(jīng)形成了如下的引用關(guān)系,以UIButton為例:
UIViewController->UIView->subView->UIButton
然后你為這個UIButton聲明一個weak屬性
@property(nonatomic,weak) IBOOutlet UIButton *btn;
相當于xib/sb對這個Button是強引用,你聲明的屬性對它是弱引用。
- 從storyboard或者xib上創(chuàng)建控件,在控件放在view上的時候,已經(jīng)形成了如下的引用關(guān)系,以UIButton為例:
2.手動創(chuàng)建控件
a). 將控件聲明成strong
@property(nonatomic,strong) UIButton *btn;
那么你在實現(xiàn)這個控件時只需這樣:
_btn = [[UIButton alloc]init];
[self.view addSubview:_btn]b). 將控件聲明成weak
@property(nonatomic,weak) UIButton *btn;
那么你在實現(xiàn)這個控件時需要這樣:
UIButton *button = [[UIButton alloc]init];
_btn = button;
[self.view addSubview:_btn];-
最近看的黑馬iOS視頻上給的建議的是:
1.如果用Stroyboard拖線,用weak
2.如果自定對象,用strong事實上IBOutlet的屬性一般可以設(shè)為weak是因為它已經(jīng)被view引用了,除非view被釋放,否則IBOutlet的屬性也不會被釋放,另外IBOutlet屬性的生命周期和view應(yīng)該是一致的,所以IBOutlet屬性一般設(shè)為weak。
下面我們來說說delegate為啥定義時要用weak修飾符,這個涉及到循環(huán)引用的問題。例如一個ViewController上通過強指針引用了一個tableview,tableview的datasource和delegate都必須是weak指針,因為viewController被他兩指向,如果用strong的話,就會形成強引用循環(huán)。