美文网首页
【引】Objective-C Runtime学习笔记 (一)

【引】Objective-C Runtime学习笔记 (一)

作者: Jin丶hy | 来源:发表于2016-08-23 16:25 被阅读14次

每一个NSObject都有一个指针isa

@interface NSObject <nsobject> {

    Class isa  OBJC_ISA_AVAILABILITY;

}</nsobject>

而指针的结构是:

typedef struct objc_class *Class;

struct objc_class {

  Class isa; // 指向metaclass

   

  Class super_class ; // 指向其父类

  const char *name ; // 类名

  long version ; // 类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取

  long info; // 一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;

  long instance_size ; // 该类的实例变量大小(包括从父类继承下来的实例变量);

  struct objc_ivar_list *ivars; // 用于存储每个成员变量的地址

  struct objc_method_list **methodLists ; // 与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储对象方法,如CLS_META (0x2L),则存储类方法;

  struct objc_cache *cache; // 指向最近使用的方法的指针,用于提升效率;

  struct objc_protocol_list *protocols; // 存储该类遵守的协议

    }
  • isa: 指向metaclass,也就是静态的Class。

一般一个实例Obj对象中的isa会指向普通的Class,这个Class中存储普通成员变量和对 象方法(“-”开头的方法);
普通Class中的isa指针指向静态Class,静态Class中存储static类型成员变量和类方法(“+”开头的方法)。

isa 指针的指向图

如图所示 所有metaclass中isa指针都指向根metaclass。而根metaclass则指向自身。

  • super_class:指向父类,如果这个类是根类,则为NULL。

  • objc_method_list:方法列表

struct objc_method_list {  
    struct objc_method_list *obsolete;
    int method_count;

#ifdef __LP64__
    int space;
#endif

    /* variable length structure */
    struct objc_method method_list[1];
};

在 _ struct objc_method method_list[1] 里面存储的是 objc_method _元素:

struct objc_method {  
    SEL method_name;
    char *method_types;    /* a string representing argument/return types */
    IMP method_imp;
};

具体请看大神:
http://blog.csdn.net/a19860903/article/details/44853841

http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/

http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/

相关文章

网友评论

      本文标题:【引】Objective-C Runtime学习笔记 (一)

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