美文网首页
iOS中assign引用对象为什么不会被置为nil

iOS中assign引用对象为什么不会被置为nil

作者: Sweet丶 | 来源:发表于2020-09-14 09:30 被阅读0次
    一、assign和weak的区别?
    • assign是MRC和ARC下都有的,可用来修饰对象和基本数据类型,当修饰对象时,不会使引用计数+1,但是在对象释放时,这个指针并不会赋值为nil,如果再次使用它就会出现野指针错误。

    • weak是ARC下,只能用来修饰对象类型,weak指针不会使对象引用计数+1,而且在对象销毁时,这个weak指针会自动赋值为nil,不会出现野指针错误。

    二、为什么assign不会自动赋值为nil?

    看MRC下的setter方法实现可知,assign直接是对属性的指针赋值为参数的指针,不会调用retain,所以计数器不会+1;ARC下对象销毁时会将weak引用表里面的指针逐个赋值为nil,对于assign没有这个操作,所以不会赋值为nil。

    //assign环境下
    -(void)setName:(NSString *)name{
    
        _name = name;
    }
    //retain环境下
    -(void)setName:(NSString *)name{
        
        if (_name != name) {
            [_name release];
            _name = [name retain];
        }
    }
    //copy环境下
    -(void)setName:(NSString *)name{
    
        if (_name != name) {
            [_name release];
            _name = [name copy];
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS中assign引用对象为什么不会被置为nil

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