开启log

- 在
log_and_fill_cache,函数里,我们看到了objcMsgLogEnabled这个变量,显然都objcMsgLogEnabled = true时,系统可以打印msgSend的日志
- 我们找到其赋值的地方

- 显然我们调用
instrumentObjectMessageSends方法可以对其进行赋值

使用
- 当前只在
mac程序中使用, 模拟器还没找到解决方法
- 声明
extern void instrumentObjcMessageSends(BOOL flag);
extern void instrumentObjcMessageSends(BOOL flag);
int main(int argc, const char * argv[]) {
@autoreleasepool {
instrumentObjcMessageSends(YES);
WLWPerson *person = [WLWPerson alloc];
[WLWPerson say666];
instrumentObjcMessageSends(NO);
NSLog(@"Hello, World!");
}
return 0;
}


- 可以看到整个
objc_msgSend流程
- resolveClassMethod -> resolveInstanceMethod -> forwardingTargetForSelector->methodSignatureForSelector -> resolveInstanceMethod -> doesNotRecognizeSelector