天天看点

Objective-C基础学习[email protected]的所有属性详解

转自: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]; 

}