美文网首页iOS开发bug以及解决方案
xib or storyboard 关联的控件要用weak,手动

xib or storyboard 关联的控件要用weak,手动

作者: AT19 | 来源:发表于2018-02-28 09:54 被阅读14次

    文章出自

    一、在OC中,如果对象没有强引用,就会被自动释放,那么为什么控件还可以设为weak?

    我们平时定义控件属性的时候一般都会用strong修饰符,而我们在用xib,sb拖控件的时候会发现,这时属性都是用的weak修饰符。

    <u style="user-select: text !important; box-sizing: border-box; outline: 0px;">1. 从storyboard或者xib上创建控件</u>,在控件放在view上的时候,已经形成了如下的引用关系,以UIButton为例:
    UIViewController->UIView->subView->UIButton
    然后你为这个UIButton声明一个weak属性

    @property(nonatomic,weak) IBOOutlet UIButton *btn;
    
    

    相当于xib/sb对这个Button是强引用,你声明的属性对它是弱引用。

    <u style="user-select: text !important; box-sizing: border-box; outline: 0px;">2.手动创建控件</u>
    a). 将控件声明成strong

    @property(nonatomic,strong) UIButton *btn;
    
    

    那么你在实现这个控件时只需这样:

    _btn = [[UIButton alloc]init];
    [self.view addSubview:_btn]
    
    

    b). 将控件声明成weak

    @property(nonatomic,weak) UIButton *btn;
    
    

    那么你在实现这个控件时需要这样:

    UIButton *button = [[UIButton alloc]init];
    _btn = button;
    [self.view addSubview:_btn];
    

    最近看的黑马iOS视频上给的建议的是:
    1.如果用Stroyboard拖线,用weak
    2.如果自定对象,用strong

    事实上IBOutlet的属性一般可以设为weak是因为它已经被view引用了,除非view被释放,否则IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,所以IBOutlet属性一般设为weak。

    image

    二、下面我们来说说delegate为啥定义时要用weak修饰符,这个涉及到循环引用的问题。例如一个ViewController上通过强指针引用了一个tableview,tableview的datasource和delegate都必须是weak指针,因为viewController被他两指向,如果用strong的话,就会形成强引用循环。

    image

    相关文章

      网友评论

        本文标题:xib or storyboard 关联的控件要用weak,手动

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