iOS-@property到底是个啥

2017-11-18 09:54:52来源:http://tr2e.com.cn/2017/11/16/iOS-property/作者:Tree人点击

分享


记关于@property
的一次深入学习探究


属性与实例变量


当我们写下@property NSObject *foo
时,编译器帮我们做了以下几件事(这个过程也被称为“自动合成(autoSynthesize)“)


创建实例变量_foo
声明foo属性的setter
、getter
方法
实现foo属性的setter
、getter
方法

但是很久之前的GCC编译器时代,声明一个属性,需要分三步书写


.h
{
NSObject *foo;
}
@property NSObject *foo
.m
@synthesize foo;


创建foo
成员变量,@property
负责声明setter
/getter
方法,而@synthesize
则负责实现这两个方法



后来苹果将编译器改为LLVM,我们就不必再为属性对应声明实例变量,编译器自动创建一个下划线开头的_foo
实例变量,并且为我们实现@synthesize foo = _foo
的属性与实例变量的对应,这就解释了为什么我们重写setter
/getter
方法时,都是操作的_foo
实例变量,而不是foo
。当然,如果你愿意,可以不使用系统自动生成的_foo
,自己用@synthesize foo = differentFoo
去指定一下名字。



与自动合成相对应的是@dynamic
,作用是告诉编译器取消自动执行的上述三个步骤,对应操作与开发者自己实现。最为常见的是程序中实现对NSUserDefault
读写的管理类,这个类的属性就不需要编译器帮我们合成


微信扫一扫

第七城市微信公众平台