iOS Developer

小谈@property的特质

2016-11-07  本文已影响88人  韶华笑

熟悉OC的小伙伴都会经常用到property(属性),属性是OC语言的一种特性,主要作用是封装对象中的数据,OC对象通常会把所需要的数据保存为各种实例变量。实例变量一般通过存取方法(access method)来访问。
使用属性时又一个问题需要注意:就是属性后面会经常附带一些特质(attribute),区分好每一种特质的作用是非常必要的。
例如下面的代码就有三种特质:

@property (nonatomic, copy, readonly) NSString * aString;

属性的特质主要分为以下四类:

1.原子性

在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不需要使用同步锁。与nonatomic对应的是atomic。注意:尽管没有命名为atomic的特质,扔可以在属性的特质中写atomic的声明,编译器也不会报错。若是自己定义属性的存取方法,就应该遵循属性的特质。
具备atomic特质的属性的获取方法会通过锁定机制来确保其操作的原子性。也就是说,如果有两个线程读写同一个属性,那么不论何时都能有效的属性值。如果时nonatomic特质(不加锁)的属性,当其中一个线程在改写值时,另一个线程也会突然闯入,把尚未修改好的属性值读取出来,这种情况下读取出来的值有可能是错误的。但是atomic特质会对系统能耗较大,属性常用nonatomic,也是默认的特质。

2.读/写权限

3.内存管理

属性用于封装数据,而数据需要有具体的所有权语义(concrete ownership semantic),下面这些会影响属性的设置方法(setter)

    - (void)setName:(NSString *)newName {
        NSString *tmp = newName;
        [_oldName release];
        _oldName = tmp;
    }

4.方法名

可通过如下特质来制定获取方法设置方法的名称。

@prpperty (getter=isAuth) BOOL auth;

over。

参考

《Effective Objective-C》

上一篇 下一篇

猜你喜欢

热点阅读