當我們把xib/sb的File’s owner設置為view時,即xib/sb的擁有者是view,所以IBOutlet的屬性一般設置為weak,因為它已經被view引用了。除非view移除IBOutlet的屬性或view本身釋放,否則IBOutlet的屬性也不會被釋放。
當我們把IBOutlet的屬性設置為strong時,那么當IBOutlet屬性所持有的view釋放時,由于IBOutlet屬性被強引用,會導致無法釋放。
舉例說明:
WBViewController綁定一個WBViewController.xib,并在xib添加一個WBLabel(UILabel的之類重寫了dealloc方法,用于觀察是否釋放),一個按鈕。
用例一
@interface WBViewController ()
@property (nonatomic, weak) IBOutlet WBLabel *label;
@end
@implementation WBViewController
- (IBAction)btnpress:(UIButton *)sender {
[self.navigationController popViewControllerAnimated:YES];
}
當點擊按鈕pop掉當前controller時發現,不管將label設置為weak或者strong,label都會釋放。
weak時,只有一個持有者view
釋放了,WBLabel的dealloc調用了,IBOutlet釋放了。
strong時,label的兩個持有者controller與view
都釋放了,WBLabel的dealloc調用了,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];
}
}
}
當點擊按鈕移除label時:
weak時,只有一個持有者view
,view的subviews移除了label,WBLabel的dealloc調用了,label釋放了。
strong時,label的兩個持有者controller與view
,view的subviews移除了label,view不再持有label,但是此時label設置為strong,controller持有了label,即使view移除了label,WBLabel的dealloc也不會調用,label不會釋放。直到controller釋放,label才會釋放。
總結:
UIViewController的view屬性是strong,因為controller要直接擁有view。而添加到view上的subviews,作為IBOutlet只需要設置為weak就可以了,因為他們不是controller直接擁有的,
如果將IBOutlet設置為strong,會造成IBOutlet的File’s owner釋放IBOutlet時,IBOutlet屬性釋放不了的問題。