Objective-C objc_class 介绍

 
 

Objective-C objc_class 介绍

NSObject

Objective-C 中 NSObject是大多数类的根类。

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. @interface NSObject <NSObject> {  
  2.     Class isa  OBJC_ISA_AVAILABILITY;  
  3. }  

它有一个isa属性,类型是Class.

苹果已经将 ObjC runtime 代码开源了,我们下载下,看看Class到底是什么http://opensource.apple.com/tarballs/objc4/objc4-493.9.tar.gz

objc_class

我们可以在<objc.h>文件里看到Class的定义

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. typedef struct objc_class *Class;  
  2. typedef struct objc_object {  
  3.     Class isa;  
  4. } *id;  

Class 是一个 objc_class 结构类型的指针, id是一个 objc_object 结构类型的指针.

objc_class的定义可以在<runtime.h>里找到

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. struct objc_class {  
  2.     Class isa;  
  3.     Class super_class;  
  4.     const charchar *name;  
  5.     long version;  
  6.     long info;  
  7.     long instance_size;  
  8.     struct objc_ivar_list *ivars;  
  9.     struct objc_method_list **methodLists;  
  10.     struct objc_cache *cache;  
  11.     struct objc_protocol_list *protocols;  
  12.   
  13. } OBJC2_UNAVAILABLE;  

接下来我们来看下每个属性的意思

isa

是一个 Objective-C Class 类型的指针. 实例对象有个isa的属性,指向Class, 而Class里也有个isa的属性, 指向meteClass. 这里就有个点, 在Objective-C中任何的类定义都是对象.

super_class

指向该类的父类, 如果该类已经是最顶层的根类(如 NSObject 或 NSProxy),那么 super_class 就为 NULL.

他们的关系呢,这里有个图http://www.sealiesoftware.com/blog/class%20diagram.pdf


name

我们先看下下面的代码

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. id objc_getClass(const charchar *aClassName)  
  2. {  
  3.     if (!aClassName) return Nil;  
  4.   
  5.     // NO unconnected, YES class handler  
  6.     return look_up_class(aClassName, NO, YES);  
  7. }  
  8.   
  9. PRIVATE_EXTERN id look_up_class(const charchar *aClassName, BOOL includeUnconnected, BOOL includeClassHandler)  
  10. {  
  11.     BOOL includeClassLoader = YES; // class loader cannot be skipped  
  12.     id result = nil;  
  13.     struct old_class query;  
  14.   
  15.     query.name = aClassName;  
  16.   
  17.  retry:  
  18.   
  19.     if (!result  &&  class_hash) {  
  20.         // Check ordinary classes  
  21.         mutex_lock (&classLock);  
  22.         result = (id)NXHashGet(class_hash, &query);  
  23.         mutex_unlock (&classLock);  
  24.     }  
  25.   
  26.     if (!result  &&  includeUnconnected  &&  unconnected_class_hash) {  
  27.         // Check not-yet-connected classes  
  28.         mutex_lock(&classLock);  
  29.         result = (id)NXHashGet(unconnected_class_hash, &query);  
  30.         mutex_unlock(&classLock);  
  31.     }  
  32.   
  33.     if (!result  &&  includeClassLoader  &&  _objc_classLoader) {  
  34.         // Try class loader callback  
  35.         if ((*_objc_classLoader)(aClassName)) {  
  36.             // Re-try lookup without class loader  
  37.             includeClassLoader = NO;  
  38.             goto retry;  
  39.         }  
  40.     }  
  41.   
  42.     if (!result  &&  includeClassHandler  &&  objc_classHandler) {  
  43.         // Try class handler callback  
  44.         if ((*objc_classHandler)(aClassName)) {  
  45.             // Re-try lookup without class handler or class loader  
  46.             includeClassLoader = NO;  
  47.             includeClassHandler = NO;  
  48.             goto retry;  
  49.         }  
  50.     }  
  51.   
  52.     return result;  
  53. }  
  54.   
  55. struct old_class {  
  56.     struct old_class *isa;  
  57.     struct old_class *super_class;  
  58.     const charchar *name;  
  59.     long version;  
  60.     long info;  
  61.     long instance_size;  
  62.     struct old_ivar_list *ivars;  
  63.     struct old_method_list **methodLists;  
  64.     Cache cache;  
  65.     struct old_protocol_list *protocols;  
  66.     // CLS_EXT only  
  67.     const uint8_t *ivar_layout;  
  68.     struct old_class_ext *ext;  
  69. };  

objc_getClass从一个字串返回一个类,look_up_class,先创建一个old_class对象,name赋值为这个字串,如果 找到了,就返回old_class.看下old_class的结构就能看出name这个属性存的值就是类的名字(其实name不就是名字嘛)

version

类的版本信息,默认为0

info

供运行期使用的一些位标识。

instance_size

该类的实例变量大小

ivars
[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. struct objc_ivar_list {  
  2.     int ivar_count;  
  3.     /* variable length structure */  
  4.     struct objc_ivar ivar_list[1];  
  5. }  

成员变量的数组

methodLists

方法定义的数组

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. struct objc_method_list {  
  2.     struct objc_method_list *obsolete;  
  3.     int method_count;  
  4.     /* variable length structure */  
  5.     struct objc_method method_list[1];  
  6. }  
objc_cache

指向最近使用的方法.用于方法调用的优化.

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. struct objc_cache {  
  2.     unsigned int mask /* total = mask + 1 */;  
  3.     unsigned int occupied;  
  4.     Method buckets[1];  
  5. };  
protocols

协议的数组

[objc] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. struct objc_protocol_list {  
  2.     struct objc_protocol_list *next;  
  3.     long count;  
  4.     Protocol *list[1];  
  5. };  
 
原文地址 http://blog.csdn.net/uxyheaven/article/details/38113901
原文地址:https://www.cnblogs.com/NSong/p/5438931.html