Runtime 与 Aspects

2018-04-12  本文已影响0人  Alfred的记录本

Runtime 之 isa指针

111.png

1.横向看:实例是对象,类也是对象(类对象),meta类也是对象(原类对象)
这是很重要的一点,希望大家理解,我们这里忽略上下结构,先看左右结构,从左到右的指向就是之前介绍的runtime源码中objc_class结构里isa的指向,Instance指的是我们创建的对象,Subclass(class)就是创建该对象的那个类,注意:创建对象的类本身也是对象,称为类对象,类对象中存放的是描述实例相关的信息,例如实例的成员变量,实例方法。
类对象里的isa指针指向Subclass(meta),Subclass(meta)也是一个对象,是原类对象,原类对象中存放的是描述类相关的信息,例如类方法,在这一过程中,isa的两次指向很像很像,大家注意理解。
2.纵向看:
superclass指针很容易理解,就是按照继承关系向上指的,一直到继承链的最上方。

参考:为什么object_getClass(obj)与[OBJ class]返回的指针不同

实例方法class 和类方法class

+ (Class)class {
    return self;
}

- (Class)class {
    return object_getClass(self);
}
Person *obj = [Person new];
    NSLog(@"instance         :%p", obj);
    NSLog(@"class            :%p", object_getClass(obj));
    NSLog(@"meta class       :%p", object_getClass(object_getClass(obj)));
    NSLog(@"root meta        :%p", object_getClass(object_getClass(object_getClass(obj))));
    NSLog(@"root meta's meta :%p", object_getClass(object_getClass(object_getClass(object_getClass(obj)))));
    NSLog(@"---------------------------------------------");
    NSLog(@"class            :%p", [obj class]);
    NSLog(@"meta class       :%p", [[obj class] class]);
    NSLog(@"root meta        :%p", [[[obj class] class] class]);
    NSLog(@"root meta's meta :%p", [[[[obj class] class] class] class]);
instance         :0x135d50810
class            :0x1008d6b58
meta class       :0x1008d6b80
root meta        :0x1a0b6c048
root meta's meta :0x1a0b6c048
---------------------------------------------
class            :0x1008d6b58
meta class       :0x1008d6b58
root meta        :0x1008d6b58
root meta's meta :0x1008d6b58

Note: 其实这里的难点就在于对 .class 和 object_getClass 的区分。
.class 当 target 是 Instance 则返回 Class,当 target 是 Class 则返回自身
object_getClass 返回 isa 指针的指向

Runtime 之一些方法

Method targetMethod = class_getInstanceMethod(klass, selector);//函数的实例
IMP targetMethodIMP = method_getImplementation(targetMethod);//函数的实现

消息转发机制

消息转发机制

Aspects

333.png

然后,我们再来看看hook后,一个viewWillAppear:的实际调用顺序:

参考
消息转发机制与Aspects源码解析

上一篇 下一篇

猜你喜欢

热点阅读