property的本质

2018-07-30  本文已影响0人  MrGan先生

前言

关于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。

看下图代码:

图1

控制器有两个属性string和string2

class_copyPropertyList得到ViewController控制器的成员属性列表,遍历列表,通过property_getName和property_getAttributes分别得到成员属性的名字和属性。打印结果如下:

图2

其中T就代表类型,C就代表Copy,N代表nonatomic,V就代表对于的实例变量。

另外我们看,我们定义了实例变量_string,把实例变量赋值为@"abc",再打印属性self.string,发现是同一个值,说明他两指向同一个对象。

另外关于属性的修饰符,参考如下表:

属性修饰符表

另外在T类型后面可能会跟有q、d、b等符号,参考如下表:

符号的意思

好了,本篇就介绍到这里。

另外,作者最近学习了一句话觉得挺有道理:物来顺应,未来不迎,当时不忘,既过不恋。共勉!!!

上一篇下一篇

猜你喜欢

热点阅读