文章出自
一、在OC中壶辜,如果對象沒有強引用悯舟,就會被自動釋放,那么為什么控件還可以設(shè)為weak?
我們平時定義控件屬性的時候一般都會用strong修飾符砸民,而我們在用xib抵怎,sb拖控件的時候會發(fā)現(xiàn),這時屬性都是用的weak修飾符岭参。
<u style="user-select: text !important; box-sizing: border-box; outline: 0px;">1. 從storyboard或者xib上創(chuàng)建控件</u>反惕,在控件放在view上的時候,已經(jīng)形成了如下的引用關(guān)系,以UIButton為例:
UIViewController->UIView->subView->UIButton
然后你為這個UIButton聲明一個weak屬性
@property(nonatomic,weak) IBOOutlet UIButton *btn;
相當(dāng)于xib/sb對這個Button是強引用演侯,你聲明的屬性對它是弱引用姿染。
<u style="user-select: text !important; box-sizing: border-box; outline: 0px;">2.手動創(chuàng)建控件</u>
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)援雇。