@property里的各种attribute特质理解

1、原子性atomicity,在默认情况下,编译器合成的方法会通过锁定机制确保属性的原子性,如果属性具备nonatiomic特质,则不实用同步锁,如果不具备nonatomic特质,那它是原子的(默认)。

2、读写权限readwrite/readonly,如果属性拥有readwrite特质,则其拥有getter方法和setter方法,若由@synthesize实现,则编译器自动生成这两个方法。readonly特质仅拥有getter方法,只有当由@synthesize实现时,编译器才会为其合成获取方法。

3、内存管理方面
assign:setter设置方法只会执行针对“纯量类型“(如CGFloat)的简单赋值操作。
strong:表明属性定义了一种“拥有关系”,为属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
weak:表明属性定义了一种“非拥有关系”,为属性设置新值时,设置方法既不保留新值,也不释放旧值。同assign类似,然而当属性所指对象被销毁时,属性值也会清空(nil out)。
unsafe_unretained:跟assign语义相同,但适用于“对象类型”,表达一种”非拥有关系(unretained)“,当目标对象被销毁时,属性值不会自动清空(unsafe)
copy:此特质表达的语义跟strong类似,然而设置方法不保留新值,而是将其copy拷贝,比如属性类型为NSString*时,传递的新值可能指向NSSMutableString类的实例,那么设置完属性之后,有可能会在该属性不知情的情况下遭人更改。所以需要copy一份“不可变”的字符串。通常用于设置属性所用的对象是“可变的”,就应该在设置新属性时拷贝一份。

4、方法名:用于指定存取方法名,getter=,name为指定的获取方法,setter同理,不太常用。

注意:
如果是自己实现属性的存取方法,应让其具备属性所声明的相关特质。
ios程序通常使用nonatomic,减少性能开销,开发mac os程序则不太会影响性能。

要点:
可以用@property定义对象中所封装的数据。
通过“特质”来只能存储数据所需的正确语义。

你可能感兴趣的:(@property里的各种attribute特质理解)