美文网首页
iOS 动态属性 id 分析

iOS 动态属性 id 分析

作者: 一口一个大胖子呀 | 来源:发表于2018-03-09 10:38 被阅读0次

    iOS的动态性中有一个很重要的属性就是id的动态性

    id:一种动态属性,在编译过程中可以根据上下文,灵活的判定对象的具体属性

    打开objc.h文件我们可以看到关于id的代码定义

    /// A pointer to an instance of a class. 某个对象的指针

     typedef struct objc_object *id;

    /// Represents an instance of a class.代表了某个实例对象

    struct objc_object {

        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

    };

    可以知道的是在C语言对OC的解释中,objc_object这个结构体 代表的某个实例对象,而id指向的就是这个实例对象的指针

    objc_object这个结构体包含一个指向Class的isa指针,既isa是一个指向Class的指针。

    那么现在我们可以这样理解,OC里面的实例对象本质上就是个指向某个Class类型的指针结构体;而id作为一种具有动态性的实例对象其实也是指向objc_object的指针。

    /// An opaque type that represents an Objective-C class.

    typedef struct objc_class *Class;

    Class的定义中说明其本身也是一个指针,指向objc_class。

    struct objc_class {

        Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

    #if !__OBJC2__

        Class _Nullable super_class                              OBJC2_UNAVAILABLE;

        const char * _Nonnull name                              OBJC2_UNAVAILABLE;

        long version                                            OBJC2_UNAVAILABLE;

        long info                                                OBJC2_UNAVAILABLE;

        long instance_size                                      OBJC2_UNAVAILABLE;

        struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;

        struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;

        struct objc_cache * _Nonnull cache                      OBJC2_UNAVAILABLE;

        struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;

    #endif

    } OBJC2_UNAVAILABLE;

    objc_class其本身是一个结构体,objc_class其实就是C语言对OC中类的解释。

    相关文章

      网友评论

          本文标题:iOS 动态属性 id 分析

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