美文网首页
关于iOS基本属性修饰符的理解(Strong篇)

关于iOS基本属性修饰符的理解(Strong篇)

作者: CrazySnow | 来源:发表于2021-07-27 17:29 被阅读0次

    iOS主要属性修饰符包括:

    • strong
    • weak
    • assign
    • copy
    • retain
    • readwrite
    • readonly
    • nonatomic
    • atomic

    关于属性修饰符strong的理解:

    用strong修饰的属性,是强引用,引用计数会加1,其赋值是调用objc_storeStong()函数
    其实现方式如下:strong修饰的属性赋值是先赋新值,然后才会释放旧值

    void
    objc_storeStrong(id *location, id obj)
    {
        //将*location指向的对象赋值给prev
        id prev = *location;
        //如果新值和原来的值一致,则返回,无需继续操作
        if (obj == prev) {
            return;
        }
        //对新值引用计数加一
        objc_retain(obj);
        //将对象指针指向新值
        *location = obj;
        //释放旧值
        objc_release(prev);
    }
    

    补充内容

    strong和weak的区别
    1、strong和weak都只能用来修饰对象,strong修饰的属性是强引用,当对象没有strong类型的指针指向他时,对象就会被释放;同时会清除所有的weak型指针;于此相反的,如果没有strong类型指针指向对象,即便存在weak类型的指针,对象也会被释放,同时清除weak型指针
    2、strong 修饰的控件,不管有没有加到VC,该控件的内存都会存在,会被VC强引用,只有在dealloc之后才会释放;而weak修饰的控件,如果没有被强引用,系统会自动释放掉

    Strong和retain的区别
    修饰属性时,strong和retain是一样的效果
    当修饰block时,会有很大的区别,strong相当于copy,retain相当于assign
    block要用copy修饰,因为非ARC环境,不copy的block在栈内,ARC环境的block都是在堆内

    为什么block用scopy修饰,而不是strong或者其他修饰符

    这是一个针对MRC的问题,在MRC 下,block是创建时它的内存是分配在栈区的
    1、栈内对象的特点就是随时可能被销毁,调用的时候会崩溃
    2、block作用域是栈内,外部调用会崩溃
    所以需要用copy修饰,将block复制到堆区
    在ARC下,用strong或者copy修饰block都一样,因为系统会自动执行copy操作

    Strong和copy的区别
    对于不可变对象,strong和copy的作用是一样的,都是指向对象的地址,copy是做了一次浅拷贝
    当修饰可变对象(nsmutableString、nsmutableArray等),copy修饰的属性的set方法会将对象做了一个深拷贝,生成了一个新的对象赋值给copy修饰的属性,这样可变对象改变值的时候,copy修饰的属性不会有改变

    **修饰NSString时最好用copy,避免字符串的值被改变

    Strong和assign的区别
    assign和weak一样,都是弱引用,不会持有对象,assign还能修饰基本数据类型
    strong是强引用,会持有对象,直到引用计数为0的时候才会调用dealloc释放内存

    相关文章

      网友评论

          本文标题:关于iOS基本属性修饰符的理解(Strong篇)

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