iOS中property用法梳理

为什么要用property属性,理解"属性"的概念.

"属性"(property)是Objective-C的一项特性,用于封装对象中的数据.Objective-C对象通常会把其所需要的数据保存为各种实例变量.实例变量一般通过"存取方法"来访问.getter用于读取变量,setter用于写入变量.

如果用如下方式,声明实例变量,这是Java或C++常用的写法,在这些语言中可以定义实例变量的作用域.

@interface VVPerson : NSObject
@public
    NSString *_nickName;
    NSString *_age;
@private
    NSString *_otherData;
@end

但是上面这种做法在OC却存在问题:对象布局在编译期就已经固定了,只要碰到访问_nickName变量的代码,编译器会替换为"偏移量"(offset),这个偏移量表示:该变量距离存放对象的内存区域的起始地址有多远.但是如果增加一个实例变量,比如:

@interface VVPerson : NSObject

@public
    NSDate *_birthDay;
    NSString *_nickName;
    NSString *_age;
@private
    NSString *_otherData;
@end

原来表示 _nickName的偏移量现在指向了 _birthDay.OC对这种问题的解决办法是,把实例变量当做一种存储偏移量所用的"特殊变量",交由"类对象"保管.偏移量会在运行期查找,如果类的定义变了,那么存储的偏移量也就变了,这样无论何时访问实例变量,总能找到正确的偏移量.这就是稳固的"应用程序二进制接口"(Application Binary Interface ,ABI).ABI定义了生成代码时所遵守的规范.有了这种ABI,就可以在实现文件中定义实例变量了.以便保护与类实现有关的内部信息.

这种问题还有一种解决办法,就是不直接访问实例变量,通过个getter和setter.OC语言存取方法有着严格命名规范,所以能根据名称自动创建存取方法.@property语法就是一种标准的写法:编译器会自动写出一套存取方法,用以访问给定类型中具有给定名称的变量.

如果使用了属性,编译器会自动访问属性的方法,此过程叫做"自动合成"(autosynthesis).这个过程由编译器在编译期执行.编译器自动在属性名前加下划线,作为向类中添加的实例变量.

  • @synthesize可以用来指定变量的名字.不再使用默认加下划线的名字.
@implementation VVPerson

@synthesize nickName = _nickName;
@synthesize age = _age;
@end
  • @dynamic关键字:它会告诉编辑器,不要自动创建实现属性所用的实例变量,也不要为其创建存取方法.如果用代码访问其中的属性,编译器也不会发出警告信息.
@implementation VVPerson

@ dynamic nickName = nickName , age;

@end

属性的四类特质

  • 1.原子性
  • 2.读写权限
  • 3.内存管理语义
  • 4.方法名

原子性

atomic(原子性)和nonatomic(非原子性).如果属性具备atomic(原子性),则使用同步锁. nonatomic(非原子性)则相反.iOS开发中都用nonatomic的原因是:在IOS中使用同步锁的开销较大,这会带来性能问题.属性是原子的也并不能保证线程安全,想保证线程安全还需使用更深层的锁定机制.

读写权限

  • readwrite(读写)特质的属性有getter和setter

  • readonly(只读)特质的属性仅有getter,只有该属性由@synthesize实现时,编译器才会为其合成获取方法.

内存管理语义

  • assign: 简单赋值,不更改索引计数. 只针对纯量类型,如CGFloat或NSInterger;
  • strong:strong修饰的属性一般不会自动释放;在OC中,对象默认是强指针,在实际开放中一般属性对象一般用strong来修饰(NSArray,NSDictionary),在使用懒加载定义控件的时候,一般也用strong.
  • weak:strong持有对象,而weak不持有对象.当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
  • copy:建立一个索引计数为1的对象,然后释放旧对象.copy 一般用来修饰 NSString 和 block.
  • retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

未完待续

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

推荐阅读更多精彩内容