為什么xib連接的property要用weak,用strong會有什么問題?

當我們把xib/sb的File’s owner設置為view時,即xib/sb的擁有者是view,所以IBOutlet的屬性一般設置為weak,因為它已經被view引用了。除非view移除IBOutlet的屬性或view本身釋放,否則IBOutlet的屬性也不會被釋放。


1526461218923.jpg

當我們把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屬性釋放不了的問題。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容