美文网首页
property的本质

property的本质

作者: MrGan先生 | 来源:发表于2018-07-30 22:06 被阅读0次

    前言

    关于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等符号,参考如下表:

    符号的意思

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

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

    相关文章

      网友评论

          本文标题:property的本质

          本文链接:https://www.haomeiwen.com/subject/dhurmftx.html