1,assign :安全
简单赋值,不更改索引计数多线程
假设你用malloc分配了一块内存,而且把它的地址赋值给了指针a,后来你但愿指针b也共享这块内存,因而你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a再也不须要这块内存,可否直接释放它?答案是否认的,由于a并不知道b是否还在使用这块内存,若是a释放了,那么b在使用这块内存的时候会引发程序crash掉
应用场合:函数
对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等) ui
适用简单数据类型atom
2,retain:spa
与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,dealloc会被调用,内存被释放
3,copy:线程
用于非共享内存时,每一个指针有本身的内存空间
4,atomic//默认属性指针
A,当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问 B,当一个变量声明为atomic时,该变量为线程安全型,可是会影响访问速度, C,当一个变量声明为atomic时,在非ARC编译环境下,须要设置访问锁来保证对该变量进行正确的get/set
5,nonatomiccode
A, 当一个变量声明为nonatomic时,意味着多个线程能够同时对其进行访问
B, 当一个变量声明为nonatomic时,它是非线程安全型,访问速度快;
C, 当一个变量声明为nonatomic时,当两个不一样的线程对其访问时,容易失控。
总结:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。在多线程环境下,原子操做是必要的,不然有可能引发错误的结果。加了atomic,setter函数会变成下面这样: 对象
if (property != newValue) { [property release]; property = [newValue retain]; }
6,strong://ARC中默认属性,等于非ARC中的retain
与retain相对应,
应用场景:
strong属性用于ARC中
@property (strong,nonatomic) ViewController *viewController;
7,weak:
与assign 相对应,
应用场景:
用于IBOutlets,如,UIViewController的子类,即通常的控件。
@property (weak, nonatomic) IBOutlet UIButton *myButton;
strong与weak的区别举例:
前提:
咱们把要用strong或者weak的对象比做一只风筝,风筝想挣脱线的束缚,自由飞翔去,若是此时有一根线,那么这只风筝就挣脱不了
过程分析
strong属性的变量:
当咱们把指向一只风筝的变量声明为strong时,此时,你就拥有控制这只风筝的线,假如此时有五我的同时控制这只风筝(即这只风筝对象有三个strong类型的变量指向它),那么只有一种状况,这只风筝才会挣脱掉线的束缚:这三我的都放掉手中的线,(release掉)
weak属性的变量:
当咱们把指向一只风筝的变量声明为weak时,此时,就像站在旁边看风筝的观众们同样,当上面的三我的还握着手中的线时,他们只能看到风筝,并不能控制它,他们能作的只能是用手指指向风筝,并大喊,“看,那只风筝飞得真高!”,然而,当上面的三我的把手中的线都放掉时,此时,风筝飞走了,看不见了,无论有再多的观众,他们再也看不到风筝了,这个故事告诉咱们一个道理:当strong类型的指针被释放掉以后,全部的指向同一个对象的weak指针都会被清零。
8,readonly
只有get方法,没有set方法
9,readwrite//默认属性
有get/set方法
10,unsafe_unretauined
用在ARC编译环境下,在此环境下,与assign类似。它只是告诉ARC如何正确地调用声明为unsafe_unretauined变量的retain和release