zoukankan      html  css  js  c++  java
  • iOS-浅谈runtime运行时机制

      一、首先,从  runtime.h头文件中找到对 class object 的定义 

      

     1 /// An opaque type that represents an Objective-C class.
     2      typedef struct objc_class *Class; 
     3  
     4 /// Represents an instance of a class. 
     5     struct objc_object {     
     6         Class isa; 
     7     };  
     8 
     9 /// A pointer to an instance of a class. 
    10     typedef struct objc_object *id;
    View Code

      由此可见,Class是一个指向objc_class结构体的指针,而id是一个指向objc_object结构体的指针,其成员isa是一个指向objec_class结构体的指针。

      二、下面我们再看看头文件中关于objc_class的定义

     1 struct objc_class {         
     2     Class isa; // 指向metaclass                 
     3      Class super_class ; // 指向其父类        
     4      const char *name ; // 类名         
     5     long version ; // 类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取         
     6     long info; // 一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;         
     7     long instance_size ; // 该类的实例变量大小(包括从父类继承下来的实例变量);         
     8     struct objc_ivar_list *ivars; // 用于存储每个成员变量的地址         
     9     struct objc_method_list **methodLists ; // 与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储对象方法,如CLS_META (0x2L),则存储类方法;         
    10     struct objc_cache *cache; // 指向最近使用的方法的指针,用于提升效率;         
    11     struct objc_protocol_list *protocols; // 存储该类遵守的协议     
    12 }

      由此可见,类比对象的结构体中多了众多的成员,下面详细介绍下objec_class中各成员:

    isa:objec_object(对象)中isa指针指向的类结构称为class(也就是该对象所属的类),其中存放着普通成员变量与对象方 (“-”开头的方法);然而此处isa指针指向的类结构称为metaclass,其中存放着static类型的成员变量与static类型的方法 (“+”开头的方法)。

    super_class指向该类的父类的指针,如果该类是根类(如NSObject或NSProxy),那么super_class就为NULL

    下面,我们通过一幅图可以看清楚OC中类与对象的继承层次关系:

     

    注意:所有的metaclass中isa指针都是指向根metaclass,而根metaclass则指向自身。根metaclass是通过继承根类产生的,与根class结构体成员一致,不同的是根metaclass的isa指针指向自身。

    1、当我们调用某个对象的对象方法时,它会首先在自身isa指针指向的类(class)methodLists中查找该方法,如果找不到则会通过class的super_class指针找到其父类,然后从其methodLists中查找该方法,如果仍然找不到,则继续通过 super_class向上一级父类结构体中查找,直至根class;

    2、当我们调用某个类方法时,它会首先通过自己的isa指针找到metaclass,并从其methodLists中查找该类方法,如果找不到则会通过metaclass的super_class指针找到父类的metaclass结构体,然后从methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父类结构体中查 找,直至根metaclass;

      经过以上介绍,相信你已经对OC中对象与类的结构层次有了进一步的认识。后面将会介绍如何使用runtime机制。

  • 相关阅读:
    Android的数据存储
    Servlet第一天
    JavaScript高级程序设计读书笔记(3)
    Interesting Papers on Face Recognition
    Researchers Study Ear Biometrics
    IIS 发生意外错误 0x8ffe2740
    Father of fractal geometry, Benoit Mandelbrot has passed away
    Computer vision scientist David Mumford wins National Medal of Science
    Pattern Recognition Review Papers
    盒模型bug的解决方法
  • 原文地址:https://www.cnblogs.com/WiliamF/p/6117811.html
Copyright © 2011-2022 走看看