• 认识Runtime1


    认识Runtime1

    什么是id?

    id在objc.h中的定义如下:

    typedef struct objc_object *id;
    

    那么什么是objc_object呢?
    objc_object在objc.h中的定义如下:

    struct objc_object {
    	Class isa;
    }
    

    这个时候我们知道Objective-C中的object最后被转化成了C的结构体,而在这个struct种只有一个isa指针,指向它的类别Class.
    那么什么是Class 呢?
    在objc.h中定义如下:

    typedef struct objc_class *Class;
    

    我们可以看懂Class本身指向的也是一个C的struct objc_class.
    我们看一下runtime.h中objc_class的定义如下:

    struct objc_class {
    	Class isa                       OBJC_ISA_AVAILABILITY,  
    #if !_OBJC@_
    	Class super_class               OBJC2_UNAVAILABLE;//父类
    	const char *name                OBJC2_UNAVAILABLE;//类名
    	long version                    OBJC2_UNAVAILABLE;     //类的版本信息,默认为0
    	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;
    
    • isa指向类的本身
    • cache:用于缓存最近使用的方法。一个接收者对象接收到一个消息时,它会根据isa指针去查找能够响应这个消息的对象。实际中,对象只有一部分方法是常用的,很多方法其实根本不用。这样,如果每次消息来时,我们都是在methodLists中遍历一遍,性能肯定会很差。这时cache就盼上用场了。每次调用过一个方法之后,这个方法就会被缓存到cache列表中,下次调用的时候runtime就会优先去cache中查找,如果没有才去methodLists中查找方法,这样对于经常用到的方法的调用,提高了调用效率。

    在OC中,一切都是对象,Class在设计的本身也是一个对象。而这个Class对象对应的类,我们叫他Meta Class.即Class结构体中的isa指向就是他的元类。

    Meta Class

    我们可以把Meta Class理解为一个Class对象的Class.简单的说:

    • 当我们发送一个消息给一个NSObject对象时,这条信息会在对象的类方法列表里面查找。
    • 当我们发送一个消息给一个类时,这条消息会在Meta Class的方法列表里查找。

    附:

    参考自:

  • 相关阅读:
    正则表达式
    Ajax跨域问题---jsonp
    Ajax
    字符串总结
    js 字符串加密
    jsDate()
    HDU 5430 Reflect
    HDU 5429 Geometric Progression
    HDU 5428 The Factor
    POJ 2485 Highways
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4734953.html
Copyright © 2020-2023  润新知