Objective-C中的runtime理解

作者: wxin9 | 来源:发表于2015-08-06 15:58 被阅读541次

    Objective-C是一门动态语言,为什么是动态语言,是因为Objective-C除了有自己的编译器外,他还有一套系统来进行动态的创建类和对象以及消息的发送、传递,这套系统就是:runtime
    首先,objc(以下Objective-C都用objc代替,我觉得大家也都懂的)虽然是Apple的程序的核心语言,Apple自己也是一个封闭的系统,但是objc本身是一套开源的语言,想看他的源代码,地址是:

    http://opensource.apple.com/tarballs/objc4/

    我看的是objc4-647.tar.gz版本,接下来,我来说说自己对于runtime的理解。

    消息传递

    我是做iOS开发的,我们最常见到的方法调用就是下面这样的:

    [aFunc foo];  //aFunc为某类的一实例化对象,foo为该类中的一个方法。
    

    这是一个很常见的方法调用的例子,但与静态语言不同,使用这句方法时,编译器会把这句代码转化另外一句纯C语言的方法,在message.h中有如下定义:

    id objc_msgSend(id self, SEL op, ...);
    

    根据这句方法,我们开始我们的runtime理解。

    首先,什么是id,在objc.h中有如下定义:

    /// A pointer to an instance of a class.
    typedef struct objc_object *id; 
    

    可以看得出,id是一个指向objc_object结构体的指针,那么objc_object是怎样的?在objc.h中有如下定义:

    /// Represents an instance of a class.
    struct objc_object {
        Class isa  OBJC_ISA_AVAILABILITY;
    };
    

    可以看出,这个结构体中主要就是一个Class isa的成员,这个成员指向了所属的类。那么Class是怎么定义的呢?在objc.h中有如下定义:

    /// An opaque type that represents an Objective-C class.
    typedef struct objc_class *Class;
    

    这样就很明显了,Class是一个指向objc_class结构体的指针,那么就到objc_class了,这是在runtime.h中的定义:

    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    #endif
    
    }OBJC2_UNAVAILABLE;
    

    通过OBJC2_UNAVAILABLE可以看得出,objc2中这套定义已经不用了,我们先不说objc2中是怎样的,我们先通过这套定义来管中窥豹。

    isa是一个Class对象的Class,即:Meta Class。面向对象中,Class本身也是一个对象,因为在objc-runtime-new.h中有如下定义:

    struct objc_class : objc_object {
        // Class ISA;
        Class superclass;
        cache_t cache;             // formerly cache pointer and vtable
        class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
        ...
    

    这里的objc_class也是继承于objc_object,所以,Class在设计上也是一个对象。


    接下来的我闲了继续写,开了好几个坑了。。。

    相关文章

      网友评论

        本文标题:Objective-C中的runtime理解

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