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];
}