小谈@property的特质

熟悉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.读/写权限

  • 读&写:具备readwrite特质的属性拥有获取方法(getter)设置方法(setter),如果属性由@synthesize实现,则编译器会自动生成这两个方法(虽然再Xcode中看不见,但是可以直接使用)
  • 只读:具备readonly特质的属性将只拥有获取方法(getter),只有在属性由@synthesize实现时,编译器才会为其合成获取方法。

3.内存管理

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

  • assign 设置方法只会执行针对`纯量类型·(比如:NSInteger,CGFloat,int等)的操作。

  • strong 此特性表明了属性定义了一种拥有关系(owning relationship)。为这种属性设置新的值时,设置方法会先保留新值,并释放旧值,然后再将新值赋值上去。

    - (void)setName:(NSString *)newName {
        NSString *tmp = newName;
        [_oldName release];
        _oldName = tmp;
    }
  • weak 此特质表明了属性定义了一种非拥有关系(nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值也不释放旧值。此特质与assign 类似,然而在属性所对应的对象被释放时,属性的值会设置为nil

  • unsafe_unretaind 此特质的定义与assign特质相同,不同的是它适用于对象类型(object type),该特质表明了一种不保留关系(unretained),当所指对象被释放时,属性不会自动设置为nil(不安全 unsafe),这一点与weak区分。

  • copy 此特质所表达的所属关系与strong类似,不同的是其设置方法不会保留新值,而是将新值拷贝(copy)。属性类型是NSString时经常用此特质来保护其封装性,因为传递给设置方法的新值可能指向一个NSMutableString类的实例,此时如果不拷贝字符串,那么设置完属性之后,字符串的值可能在对象不知情的情况下被人修改。所以此时需要拷贝(copy)一份不可变的字符串,确保对象中的值不会不经意间变动。只要实现属性所用的对象是可变的,就应该在设置新值时拷贝(copy)一份。

4.方法名

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

  • getter=<name> 此特质用来指定获取方法的名称。如果属性时BOOL值,而你想为其获取方法加上is前缀,就可以用这个特质来指定,编译器就会为你合成获取方法
@prpperty (getter=isAuth) BOOL auth;
  • setter=<name> 此特质涌来指定设置方法的名称,用的不常见。

over。

参考

《Effective Objective-C》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容