• 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
  • 相关阅读:
    mybatis源码解读(二)——构建Configuration对象
    mybatis源码解读(一)——初始化环境
    JDK1.8源码(七)——java.util.HashMap 类
    JDK1.8源码(六)——java.util.LinkedList 类
    JDK1.8源码(五)——java.util.ArrayList 类
    JDK1.8源码(四)——java.util.Arrays 类
    JDK1.8源码(三)——java.lang.String 类
    JDK1.8源码(二)——java.lang.Integer 类
    JDK1.8源码(一)——java.lang.Object类
    Java的深拷贝和浅拷贝
  • 原文地址:https://www.cnblogs.com/NSong/p/5438931.html
Copyright © 2020-2023  润新知