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释放内存
网友评论