转自:http://www.linuxidc.com/Linux/2014-03/97744.htm
1、assign
简单赋值,不更改索引计数
应用场合:适用简单数据类型:基本数据类型(例如NSInteger,CGFloat)和C数据类型(int.float,double,char等)
2、retain
使用了引用计数,retain+1 release-1 ;当引用计数为0时,dealloc会被调用 内存被释放
3、strong: //ARC中默认属性,等于非ARC中的retain
4、weak
5、copy
用于非共享内存时,每个指针有自己的内存空间
6、atomic //默认属性 原子性
A,当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问
B,当一个变量声明为atomic时,该变量为线程安全型,但是会影响访问速度,
C,当一个变量声明为atomic时,在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set
7、nonatomic
A, 当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问
B, 当一个变量声明为nonatomic时,它是非线程安全型,访问速度快;
C, 当一个变量声明为nonatomic时,当两个不同的线程对其访问时,容易失控。
8、readonly
只有get方法,没有set方法
9,readwrite//默认属性
有get/set方法
10,unsafe_unretauined
用在ARC编译环境下,在此环境下,与assign相似。它只是告诉ARC如何正确地调用声明为unsafe_unretauined变量的retain和release
总结:
1)atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
if (property != newValue) {
[property release];
property = [newValue retain];
}