1:@property的作用
. 自动生成私有属性.
. 自动生成私有属性的getter setter方法的声明.
. 自动生成私有属性的getter setter方法的实现.
生成的setter实现: 都是直接赋值.
. @property参数.
. 可以带参数.
. @property(参数1,参数2,参数3….) 数据类型 名称;
. @property参数主要分为如下四类.
. 与多线程相关的.
atomic nonatomic
. 与生成的setter方法实现相关的
assign retain
. 生成的getter setter 是可读写的还是只读的封装.
readwrite readonly
. 修改生成的getter setter方法的名称
setter getter
. 与多线程相关的参数
默认值是atomic 如果不写这两个参数中的1个 那么默认就是atomic。
atomic: 生成的set方法的实现就是加了线程安全锁的.
安全性高. 但是效率相对较低.
nonatomic:生成的set方法的实现没有加线程安全锁.
安全性低 但是效率相对较高
推荐使用nonatomic 因为这样效率更高一些.
. 与生成的setter方法的实现相关的参数
默认值是assign
assign: 生成的setter方法的实现就是直接赋值.
retain: 生成的setter方法的实现就是标准的MRC内存管理代码.
属性的类型是OC对象的时候 就使用retain
属性的类型是非OC对象的时候 就使用assign
生成的是只读封装还是读写封装
默认值是: readwrite
readwrite: 同时生成属性的getter和setter
readonly: 只生成getter 而不生成setter
修改生成的getter setter方法的名称
默认情况下,@propert生成的getter setter方法的名称都是按照规范来生成的.
使用参数getter或者setter可以修改生成的getter方法和setter方法的名称.
虽然可以使用参数来更改生成的getter、setter方法的名称但是没事别乱改.
因为这样的话 方法名就不遵守规范了.
注意的问题
. 如果我们使用getter setter参数修改了生成的getter setter方法名称.
点语法仍然可以正常使用.
会自动的将点语法转换为调用修改名称以后的方法.
. setter方法的名称永远都不要改.
. 当属性的类型是1个BOOL类类型的时候.
为了让我们的代码语义看起来更符合人类的思维.
所以我们修改这个属性的getter名称 以isXXX开头.
. 使用大注意.
retain只是生成的set方法是标准的MRC内存管理代码.
不会在dealloc中生成release
所以,我们还要手动的在dealloc中写上release的代码.
. 参数使用总结
. 同1组的参数只能使用其中的1个.否则就会冲突.
但是getter和setter可以同时使用 这个不冲突.
. 使用建议.
. 无论如何使用nonatomic
. 如果属性的类型是OC对象类型使用retain 如果属性类型是非OC类型使用assign
. 如果希望可读可写 就使用readwrite 如果希望只读 就使用readonly
. 无论如何不要去修改setter的名称 只有在属性的类型是BOOL类型的时候才去修改getter的名称为isXXX.
2:@property的用法
程序的内存管理模式.分为两种. MRC和ARC
与多线程相关的参数.
atomic: 默认值
nonatomic
无论是在ARC还是MRC模式下,都使用nonatomic
retain: 只能使用在MRC模式下. 当属性的类型是1个OC对象的时候,除了循环引用之外,全部都是使用retain。
assign: 既可以用在MRC中,也可以用在ARC之中,
- 在MRC模式中和ARC模式下. 当属性的类型是1个非OC对象类型的时候. 使用assign
在MRC模式下,如果出现循环引用. 一端使用retain 一端使用assign
strong: 只能使用在ARC模式下,当属性的类型是1个OC对象的时候,除了循环引用之外,全部都是使用strong
weak: 只能使用在ARC模式下,当出现循环引用的时候. 一端使用strong 一端使用weak
readwrite: 可以使用在ARC模式和MRC模式下,代表同时生成属性的getter、setter
readonly: 可以使用在ARC模式和MRC模式下 代表只成属性的getter
修改生成的getter setter的名字: 在ARC和MRC中都可以使用.
@property参数: 在MRC中使用retain的 用strong来代替就可以了.