iOS Runtime

objc_object

id = objc_object [ isa、弱引用、关联对象、内存管理]

objc_class
class = objc_class [class superClass 、cache_t cache(方法缓存) 、class_data_bits_t bits]

isa 指针
64位
指针型 、非指针型

cache_t【用于快速查找方法执行函数、是可增量扩展的哈希表结构、是局部性原理的最佳应用】

class_data_bits_t
[对class_rw_t 封装 、
class_rw_t 代表了相关读写信息、对class_to_t的封装
class_to_t 类的相关只读信息]

class_rw_t [
class_to_t
protocols 二维数组
properties 二维数组
methods 二维数组
]

class_to_t[
name (类名)
ivars (类的成员变量)
properties 一维数组
protocols 一维数组
methodList 一维数组
]

method_t

函数四要素 :
名称、 sel name
返回值、 const char* types
参数、
函数体 imp

Type Encodings
const char* types(返回值、参数1、参数2….参数n)


WechatIMG28.jpeg

对象、类对象 、元类对象
类对象 存储实例方法列表等信息
元类对象 存储类方法列表等信息

isa 指向根元类对象

消息传递

void objc_msgSend
void objc_msgSendSuper
缓存中查找是 哈希查找
当前类方法中查找: 已排序好的 二分查找、未排序好的 一般遍历查找
父类逐级查找


WechatIMG29.jpeg

消息转发机制

+(BOOL)resolveInstanceMethod:(SEL)sel {
    //如果text方法 打印日志
    if (sel == @selector(test)) {
        NSLog(@"resolveInstanceMethod");
        return NO;
    }else {
        //从父类的默认调用
        return  [super resolveInstanceMethod:sel];
    }
}


- (id)forwardingTargetForSelector:(SEL)aSelector {
    NSLog(@"forwardingTargetForSelector");
    return nil;
}


- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if (aSelector == @selector(test)) {
        NSLog(@"methodSignatureForSelector:");
        //v代表是void类型 @代表第一个参数类型是id ,即self
        //:代表第二参数是SEL类型的 即@selector(test)
        return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    }else {
        return [super methodSignatureForSelector:aSelector];
    }
}



- (void)forwardInvocation:(NSInvocation *)anInvocation {
    NSLog(@"forwardInvocation:");
}

你可能感兴趣的:(iOS Runtime)