常用属性关键字:natomic、nonatomic、assign、weak、strong、retain、copy、unsafe_unretained、readwrite、readonly
另外还有一些修饰关键字__weak、__strong、__block、@synthesize、@dynamic
其中strong、weak是ARC环境下才使用,retain是MRC环境下才使用。
natimic
:原子操作,默认关键字,只在其相关的setter和getter方法时有加锁安全机制,其他线程安全不负责;
nonatimic
:非原子操作,没有加锁安全机制,但是访问会提高效率;
assign
:主要用来修饰基本数据类型、枚举、结构体,MRC情况下的OC对象为避免循环引用也可用assign,不增加引用计数(有点类似ARC下的weak);
weak
:ARC情况下使用,修饰OC对象,不增加引用计数,与assign不同的是对象销毁时会将对应的指针变量置nil;
strong
:ARC情况下使用,修饰OC对象,不会生成新的内存地址,增加引用计数;
retain
:MRC情况下使用,修饰OC对象,不会生成新的内存地址,增加引用计数,与strong类似,但需在dealloc中release一次;
copy
:修饰不可变类型对象和block,会生成新的内存地址,对原对象的引用计数不会发生变化;
unsafe_unretained
:等同于weak,但是对象销毁时不会将对应指针变量置nil;
readwrite
:默认关键字,会自动生成对应的setter和getter方法;
readonly
:只会自动生成getter方法,一般是供外界只读,不可修改;
__weak
:ARC情况下使用,弱引用对象,避免循环引用,主要用在block的情况下;
__strong
:ARC情况下使用,强引用对象,一般与__weak一起使用,防止在block里面用__weak修饰的对象过早被释放;
__block
:允许block改变外部传进的变量值;
@synthesize
:可对属性的成员变量进行重命名;
比如
@property (nonatomic, copy) NSString *string;
用@synthesize string = abcd修饰,那么只有名为abcd的成员变量,没有_string的成员变量
@dynamic
:告诉编译器,属性的setter方法和getter方法由用户自己实现,不自动生成,若是用户没有自己实现,那么在运行到该属性的点语法时会由于找不到setter和getter方法而导致崩溃。