- **readonly** 此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。 - **readwrite** 此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。 - **assign ** 简单赋值,不更改索引计数 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉 - **retain** 指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。 与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,dealloc会被调用,内存被释放 - **copy** 用于非共享内存时,每个指针有自己的内存空间 - **atomic//默认属性** - 当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问 - 当一个变量声明为atomic时,该变量为线程安全型,但是会影响访问速度, - 当一个变量声明为atomic时,在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set - **nonatomic** - 当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问 - 当一个变量声明为nonatomic时,它是非线程安全型,访问速度快; - 当一个变量声明为nonatomic时,当两个不同的线程对其访问时,容易失控。 - **strong**://ARC中默认属性,等于非ARC中的retain 与retain相对应, 应用场景: strong属性用于ARC中 @property (strong,nonatomic) ViewController *viewController; - **weak** 与assign 相对应, 应用场景: 用于IBOutlets,如,UIViewController的子类,即一般的控件。 @property (weak, nonatomic) IBOutlet UIButton *myButton; > strong与weak的区别举例: 前提: 我们把要用strong或者weak的对象比作一只风筝,风筝想挣脱线的束缚,自由飞翔去,如果此时有一根线,那么这只风筝就挣脱不了 过程分析 strong属性的变量: 当我们把指向一只风筝的变量声明为strong时,此时,你就拥有控制这只风筝的线,假如此时有五个人同时控制这只风筝(即这只风筝对象有三个strong类型的变量指向它),那么只有一种情况,这只风筝才会挣脱掉线的束缚:这三个人都放掉手中的线,(release掉) weak属性的变量: 当我们把指向一只风筝的变量声明为weak时,此时,就像站在旁边看风筝的观众们一样,当上面的三个人还握着手中的线时,他们只能看到风筝,并不能控制它,他们能做的只能是用手指指向风筝,并大喊,“看,那只风筝飞得真高!”,然而,当上面的三个人把手中的线都放掉时,此时,风筝飞走了,看不见了,不管有再多的观众,他们再也看不到风筝了,这个故事告诉我们一个道理:当strong类型的指针被释放掉之后,所有的指向同一个对象的weak指针都会被清零。 ### 欢迎加入iOS交流群537774852