iOS 基础 -- 属性(setter 方法 、getter 方法、点语法、@property)
属性概念
属性是 OC 的一项特性,用于封装对象中的数据 OC 对象通常会把其所需要的数据保存为各种属性属性通过存取方法来访问(setter
、getter
)
例如:在 Person 类中定义了 2 个属性
通过 @property 语法,编译器会自动生成一套存取方法
等同于
访问属性时,可以使用点语法,是一个编译器的特性,编译器会把“点语法”转换为对存取方法的调用,使用点语法和直接调用存取方法的效果一致。点语法在等号左边,那么编译器会自动转换为
setter
方法,点语法在等号右边或没有等号,那么编译器会自动转化为getter
方法
在使用属性的过程中,编译器会自动编写访问这些属性所需要的方法,这个过程叫“自动合成”。这个过程是由编译器在编译期执行的。除了生成存取方法之外,编译期还会自动向类中添加适当的类型的实例变量,并且在属性名前面加下划线,以此作为实例变量的名字
若不想让编译器自动合成存取方法,需要使用
@dynamic
,它会通知编译器不要自动创建属性所用的实例变量,也不要为其创建存储方法
属性特质
属性的特质也会影响编译器所生成的存取方法,分为四类:原子性、读写权限、内存管理关键字、方法名
原子性(
atomic
、nonatomic
)atomic(默认): 假设多个线程访问同一属性,那么所有不同线程上的操作都将依次顺序执行,该属性读取是安全的
nonatomic :如有两个线程访问同一个属性,会出现无法预料的结果,一般属性设置都是
nonatomic
,因为 iOS 中使用同步锁的开销比较大,会影响性能读写权限
readwrite:属性拥有
getter
、setter
方法readonly: 属性拥有
getter
方法内存管理关键字
assign:用于修饰数值类型,是简单赋值操作
strong:为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再把新值设置过去
weak:为这种属性设置新值时,设置方法既不会保留新值,也不释放旧值,所修饰的对象销毁时,该属性会被置为
nil
unsafe_unretained:用于修饰对象类型,所修饰的对象销毁时,该属性不会被置为
nil
copy:设置方法并不保留新值,而是将其拷贝一份。(当属性类型为
NSString
时,经常用copy
,因为传递给设置方法新值有可能指向一个NSMutableString
类的实例,这个类是NSString
的子类,若不拷贝字符串,那么设置完属性后,字符串的值就可能会在对象不知情的情况下被人更改,所有要拷贝一份不可变的字符串,确保对象中的字符串的值不会无意间变动)方法名
getter=:指定获取方法的方法名,
setter=:指定设置方法的方法名,这种用发不常见,此处不做太多解释
版权声明: 本文为 InfoQ 作者【NewBoy】的原创文章。
原文链接:【http://xie.infoq.cn/article/2897a1f5eaddd7be33741a398】。文章转载请联系作者。
评论