美文网首页iOS面试
为什么xib连接的property要用weak,用strong会

为什么xib连接的property要用weak,用strong会

作者: 东篱先生_ | 来源:发表于2018-05-16 17:36 被阅读0次

    当我们把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属性释放不了的问题。

    相关文章

      网友评论

        本文标题:为什么xib连接的property要用weak,用strong会

        本文链接:https://www.haomeiwen.com/subject/ndfmdftx.html