iOS 高级开发技巧 2.对象、消息、运行期 (一) 理解属性这一概念
属性 (property)是Objective-c中的一项特征,用于封装对象中的数据。一般我们通过“存取方法”(access method)来访问。
其中:获取方法(getter)用来读取变量的值;设置方法(setter)用来写入变量的值
属性属于每个iOS开发人员时时刻刻都在使用的东西,但是大部分人最不理解的就是它的特质----属性特质。
使用属性的时候要注意,其中的各项特质(attribute)设定也会影响编译器所生成的存取方法。
属性可以拥有的特质分为四类:
非原子性(nonatomic):原子性指的是在并发编程中我们是否可以看到它在中间步骤临时所生成的临时结果,其实这个是关于性能的,在iOS下使用nonatomic,在MacOS的开发中一般会用到atomic。有兴趣的可以自己去探索。
读写权限(read/write):读写权限分为readwrite(读写)和(readonly)只读。
内存管理语义:
1、assign: 设置方法 只会执行对 ”纯量类型“(例如:int、float、CGFloat、NSInterger等)的简单赋值操作。
2、strong:此特质表明该属性定义了一种 ”拥有关系“ 。
3、weak:此特质表明该属性定义了一种 ”非拥有关系“ 。
weak和strong的区别与理解:
strong会牵制住对象,使对象不会轻易被释放,只要仍然有一个此特质的使用者在使用,对象就不会被释放。
weak不会牵制住对象,无论有多少个此特质的使用者在使用这个对象,这个对象也会被释放。
有一个通俗的理解:strong就像一群人拉着一条狗,只要有一个人还拉着狗绳,狗就不会跑掉;而weak则好像一群小孩指着一条狗,无论有多少个小孩指着狗说我看见狗了,只要没有狗绳,狗一样会跑,当跑出他们的视线,他们就找不到狗了。
4、unsafe_unretained:此特质的寓意和assign相同,但是它适用于“对象类型”(object type),它表达的也是一种非拥有关系,但是它与weak不同,当目标对象被摧毁,属性值不会自动清空(“unsafe”),这于weak有区别。
5、copy:此特质与strong相似。然而设置方法并不保留新值,而是直接新创建一个对象。用狗的例子来说,他不会在狗身上多加一条绳子,它会复制一只狗,自己拉着。
方法名:可以通过如下特质来制定存取方法的方法名
1、getter=<name>:例如switch的on这个属性:@property (nonatomic, getter=isOn) BOOL on;所以它的获取调用方法就是: [switch isOn];
2、setter=<name>:这种方法可不太常见。
通过以上方法可以对你的属性进行一定的控制,很多人不懂的就在属性特质,这个也是需要着重学习的。
要点
- 可以用 @property语法来定义对象中所封装的数据。
- 可以通过属性特质来制定存取和储存数据所需的正确的语义。