property参数
知识点
1.【掌握】控制set方法的内存管理
2.【掌握】控制需不需要生成set方法
3.【掌握】多线程管理
4.【掌握】控制set方法和get方法的名称
1.控制set方法的内存管理
- retain: release旧值,retain新值,(用于OC对象)
- assign: 直接赋值,不做任何内存管理(默认,用于非OC对象)
- copy: release旧值,retain新值(一般用于 NSString *)
2.控制需不需要生成set方法
- readwrite: 同时生成getter、setter方法(默认)
- readonly: 只生成getter方法
3.多线程管理
- atomic: 只能单线程进行访问和修改属性,性能低(默认)
- nonatomic: 多线程进行访问和修改属性,性能高
- 注意:ios开发中99.99% 都是使用nonatomic(@property(nonatomic))
4.控制set方法和get方法的名称
setter:设置set方法的名称,一定有个冒号
getter:设置get方法的名称,一般用于BOOL值类型的属性
注意:不同类型的修饰符不能组合在一起使用
property 其他
没有告诉@property要讲传入的参数赋值给谁,默认@property会将传入的属性赋值给_开头的成员变量
@propery 有一个弊端:它只会生成简单的getter/setter方法的声明和实现,并不会对传入的数据进行过滤,如果想对传入的数据进行过滤,那么我们就必须重写getter/setter方法,如果不想对传入的数据进行过滤,仅仅是提供一个方法给外界操作成员变量,那么久可以使用@property
如果利用@property来生成getter/setter方法,那么我们可以不写成员变量,系统自动给我们生成一个_开头的成员变量
如果重写了setter方法, 那么property就只会生成getter方法
如果重写了getter方法,那么property就只会生成setter方法
如果同时重写了getter/setter方法,那么property就不会自动帮我们生成私有的成员变量(_xx就不可以使用)
注意
- @propery 自动帮我们生成的成员变量是一个私有的成员变量,也就是说在.m文件中生成的,而不是在.h文件生成的,在.m文件中可以访问,在其他文件中不可以访问
property 属性修饰符
- 如果给一个属性同时提供了getter/setter方法,那么我们就称这个属性为可读可写属性
- 如果只提供了getter方法,那么我们称这个属性为只读属性
- 如果只提供了setter方法,那么我们称这个属性为只写属性
如果既没有提供getter也没有提供setter方法, 那么我们称这个属性为私有属性
格式:
- @property(属性修饰符) 数据类型变量名称;
readwrite: 代表生成getter、setter方法。(默认情况下 @property 就是readwrite)例:@property(readwrite) int age;
- readonly: 代表生成getter方法,不生成setter方法。例:@property(readonly) NSString *name;
- 自定义setter/getter方法名
- 格式:@property(setter=xxx:) double sex; @property(getter=isMarried) BOOL married;
- 一般BOOl类型的属性才需要自定义getter方法名,因为这样提高代码阅读性(判断是否结婚:之前: [xxx married]; 之后: [xxx isMarried];)
使用场景
- copy:一般用于NSString/block
- strong:一般用于除了NSString/block之外的oc对象
- weak: 一般用于代理/UI控件,当两个对象相互引用(例如控件和控件的代理),一个用strong, 一个用weak,避免循环引用。
- assign:基本数据类型,结构体、枚举、(非oc对象)