iOS底层学习-day-13

前言-OC-runtime篇

我是一名iOS开发者, iOS底层 菜鸟的进阶之路30天。

方法缓存源码

static inline mask_t cache_next(mask_t i, mask_t mask) {
    return i ? i-1 : mask;
}

struct cache_t {
    bucket_t *_buckets;
    mask_t _mask;
    mask_t _occupied;
    
    IMP imp(SEL selector)
    {
        mask_t begin = _mask & (long long)selector;
        mask_t i = begin;
        do {
            if (_buckets[i]._key == 0  ||  _buckets[i]._key == (long long)selector) {
                return _buckets[i]._imp;
            }
        } while ((i = cache_next(i, _mask)) != begin);//_buckets[i]._key == 0的时候调用while中的东西
        return NULL;
    }
};

runtime消息发送objc_msgSend

sel_registerName("personTest") = @selector(personTest)
// objc_msgSend(person, @selector(personTest));
// 消息接收者(receiver):person
// 消息名称:personTest
  • 消息发送流程
    在这里插入图片描述

runtime objc_msgSend 方法解析

  • 开发者可以实现以下方法,来动态添加方法实现
    在这里插入图片描述
  • +resolveInstanceMethod:
+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == @selector(test)) {
        // 获取其他方法
        Method method = class_getInstanceMethod(self, @selector(other));

        // 动态添加test方法的实现
        class_addMethod(self, sel,
                        method_getImplementation(method),
                        method_getTypeEncoding(method));

        // 返回YES代表有动态添加方法
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
  • +resolveClassMethod:
struct method_t {
    SEL sel;
    char *types;
    IMP imp;
};

void c_other(id self, SEL _cmd) {
    NSLog(@"c_other - %@ - %@", self, NSStringFromSelector(_cmd));
}

+ (BOOL)resolveInstanceMethod:(SEL)sel {
    if (sel == @selector(test)) {
        // 获取其他方法
        Method method = class_getInstanceMethod(self, @selector(other));

        // 动态添加test方法的实现
        class_addMethod(self, sel,
                        method_getImplementation(method),
                        method_getTypeEncoding(method));

        // 返回YES代表有动态添加方法
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

动态添加方法

在这里插入图片描述

发布了31 篇原创文章 · 获赞 0 · 访问量 955

猜你喜欢

转载自blog.csdn.net/weixin_41732253/article/details/103956748