前言
关于property的本质是啥?作者原来也不知道,往下看!
正文
@property = ivar + getter + setter;
ivar是实例变量,getter和setter是存取方法
每一个property系统会生成一个相对应的实例变量,如下列代码
`Objective-C
@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
等效于下列代码
```Objective-C
@interface Person : NSObject
- (NSString *)firstName;
- (void)setFirstName:(NSString *)firstName;
- (NSString *)lastName;
- (void)setLastName:(NSString *)lastName;
@end
property在runtime中是`objc_property_t`定义如下:
```objective-c
typedef struct objc_property *objc_property_t;
而`objc_property`是一个结构体,包括name和attributes,定义如下:
```objective-c
struct property_t {
const char *name;
const char *attributes;
};
例如:我们定义一个string的property`@property (nonatomic, copy) NSString *string;`,通过 `property_getAttributes(property)`获取到attributes并打印出来之后的结果为`T@"NSString",C,N,V_string`,通过property_getName的得到的名字就是string。
看下图代码:
控制器有两个属性string和string2
class_copyPropertyList得到ViewController控制器的成员属性列表,遍历列表,通过property_getName和property_getAttributes分别得到成员属性的名字和属性。打印结果如下:
其中T就代表类型,C就代表Copy,N代表nonatomic,V就代表对于的实例变量。
另外我们看,我们定义了实例变量_string,把实例变量赋值为@"abc",再打印属性self.string,发现是同一个值,说明他两指向同一个对象。
另外关于属性的修饰符,参考如下表:
另外在T类型后面可能会跟有q、d、b等符号,参考如下表:
好了,本篇就介绍到这里。
另外,作者最近学习了一句话觉得挺有道理:物来顺应,未来不迎,当时不忘,既过不恋。共勉!!!