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

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篇))