@property 是声明属性的语法,我们可以通过property 快速方便的为实例创建读取器,同时允许我们通过点语法来使用读取器。
property 在创建实例的时候,会隐形的创建get 和 set 方法
在类文件外部,也可以调用property 属性所声明的实例,但是其他的方式声明的对象是不能被外部所读取的。
property 属性主要有:atomic、nonatomic、strong、copy、assign、weak、readwrite、readonly、getter、setter 等修饰符
(1)原子性:atomic 和 nonatomic
atomic 意思是原子性,意味着只有一个线程可以同时访问实例。atomic 是线程安全的,至少在当前的读取器是安全的。虽然它是一个默认属性,但是由于其使用同步锁开销较大,带来性能问题
nonatomic则表示是非原子性的。它可以被多个线程访问。效率要比atomic 高,但是不能保证其在多线程状态下的安全性,在单线程和明确只有一个线程访问的情况下被广泛使用。
(2)存取控制器
readwrite(默认值):表示其同时拥有getter 和 setter 方法;
readonly:只读操作,其只有getter 方法,没有setter 方法;
注:如果某个实例只允许被外部读取,而不能写入操作,同时在类实现文件当中可以写入的话,可以在头文件中声明属性为只读的,在实现文件中设置其为可读写的属性。
例:头文件中声明为:@property(nonatomic,readonly,copy) NSString *stringA;
实现文件中声明为:@property(nonatomic,readwrite,copy) NSString *stringA;
(3)内存管理
assign:用于值类型,如int,float 等
weak:用于NSObject 类的实例修饰,引用计数不变
strong 和 retain :修饰 NSObject 类的实例,同时引用计数会+1
copy:与strong相似,但是其分为浅层复制和深复制两种,其是对传入对象的副本拥有所有权,而不是传入对象本身。
注:copy 注意区别浅复制和深复制两种方式,NSString、NSArray、NSDictionary等不可变类型都为浅层复制,即其引用计数会+1,而不会创建新的内存。