转载自 http://www.cnblogs.com/zhangdashao/p/4438540.html 可以去这里看详细的。

 

 

每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。这个指针指向哪呢?它指向一个类对象(class object  记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C对象的一些信息(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等等。这个包含信息就是Objective-C动态能力的根源了。

那我们看看isa指针类型的数据结构是什么样的?如果抛开NSObject对象的其他的成员数据和变量,NSObject可以看成这样:

 

  1. @interface NSObject <NSObject> {  
  2.      Class    isa;  
  3. }   

不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为:

 

 

  1. struct NSObject{  
  2.    Class isa;  
  3.  }  

Class是用typedef 定义的

 

 

  1. typedef struct objc_class *Class;  

那NSObject可以这么写了

 

 

  1. struct NSObject{  
  2.   objc_class *isa  
  3. }  

那objc_class的结构是什么样的呢?大概是这样的:

 

 

  1. struct objc_class {  
  2.      Class isa;  
  3.        
  4.      Class super_class;  
  5.        
  6.      const char *name;  
  7.        
  8.      long version;  
  9.      long info;  
  10.        
  11.      long instance_size;  
  12.      struct objc_ivar_list *ivars;  
  13.      struct objc_method_list **methodLists;   
  14.        
  15.      struct objc_cache *cache;  
  16.      struct objc_protocol_list *protocols;     
  17.  }  

这里会看到,在这个结构体里还有一个isa指针,又是一重指向,是不是有种到了盗梦空间的感觉。不用紧张,take easy,不会有那么多层次的,这里的isa指针指向的是元类对象(metaclass object),带有元字,证明快到头了。那元对象有啥用呢?它用来存储的关于类的版本,名字,类方法等信息。所有的元类对象(metaclass object)都指向 NSObject的元类对象,到头还是NSObject。一共三次:类对象->元类对象->NSObject元类对象。

 

   为了得到整个类组织架构的信息,objc_class结构里定义了第二个成员变量Class super_class,它指向父类的类对象。说了这么多,可能关系缕不清楚,有道是一张图胜过千言万语

图中可以看出,D3继承D2,D2继承D1,D1最终继承NSObject。下图从D3的一个对象开始,排列出D3 D2 D1 NSObject 类对象,元类对象等关系。

图中的箭头都是指针的指向。