當(dāng)我們把xib/sb的File’s owner設(shè)置為view時(shí)趣惠,即xib/sb的擁有者是view狸棍,所以IBOutlet的屬性一般設(shè)置為weak,因?yàn)樗呀?jīng)被view引用了味悄。除非view移除IBOutlet的屬性或view本身釋放草戈,否則IBOutlet的屬性也不會(huì)被釋放。
當(dāng)我們把IBOutlet的屬性設(shè)置為strong時(shí)侍瑟,那么當(dāng)IBOutlet屬性所持有的view釋放時(shí)唐片,由于IBOutlet屬性被強(qiáng)引用丙猬,會(huì)導(dǎo)致無(wú)法釋放。
舉例說(shuō)明:
WBViewController綁定一個(gè)WBViewController.xib,并在xib添加一個(gè)WBLabel(UILabel的之類重寫了dealloc方法费韭,用于觀察是否釋放),一個(gè)按鈕茧球。
用例一
@interface WBViewController ()
@property (nonatomic, weak) IBOutlet WBLabel *label;
@end
@implementation WBViewController
- (IBAction)btnpress:(UIButton *)sender {
[self.navigationController popViewControllerAnimated:YES];
}
當(dāng)點(diǎn)擊按鈕pop掉當(dāng)前controller時(shí)發(fā)現(xiàn),不管將label設(shè)置為weak或者strong星持,label都會(huì)釋放抢埋。
weak時(shí),只有一個(gè)持有者view
釋放了督暂,WBLabel的dealloc調(diào)用了,IBOutlet釋放了揪垄。
strong時(shí),label的兩個(gè)持有者controller與view
都釋放了损痰,WBLabel的dealloc調(diào)用了,IBOutlet釋放了福侈。
用例二
@interface WBViewController ()
@property (nonatomic, weak) IBOutlet WBLabel *label;
@end
@implementation WBViewController
- (IBAction)btnpress:(UIButton *)sender {
for (UIView *view in self.view.subviews) {
if ( [view isKindOfClass:UILabel.class] ) {
[view removeFromSuperview];
}
}
}
當(dāng)點(diǎn)擊按鈕移除label時(shí):
weak時(shí),只有一個(gè)持有者view
卢未,view的subviews移除了label肪凛,WBLabel的dealloc調(diào)用了,label釋放了辽社。
strong時(shí)伟墙,label的兩個(gè)持有者controller與view
,view的subviews移除了label滴铅,view不再持有l(wèi)abel戳葵,但是此時(shí)label設(shè)置為strong,controller持有了label汉匙,即使view移除了label拱烁,WBLabel的dealloc也不會(huì)調(diào)用,label不會(huì)釋放噩翠。直到controller釋放戏自,label才會(huì)釋放。
總結(jié):
UIViewController的view屬性是strong伤锚,因?yàn)閏ontroller要直接擁有view擅笔。而添加到view上的subviews,作為IBOutlet只需要設(shè)置為weak就可以了屯援,因?yàn)樗麄儾皇莄ontroller直接擁有的猛们,
如果將IBOutlet設(shè)置為strong,會(huì)造成IBOutlet的File’s owner釋放IBOutlet時(shí)狞洋,IBOutlet屬性釋放不了的問(wèn)題弯淘。