OC中的方法调用,其实都是转化成objc_msgSend函数调用
1.信息发送

2.动态方法解析
/// 对象消息解析
对象方法表保存在类对象里,如果找不到就会去找类对象的父类,如果还是找不到,会一直继续,直到根类对象,最后找不到会去根元类对象寻找(我记得会去根元类对象寻找),还是没找到会进行消息转发
- (BOOL)resolveInstanceMethod:(SEL)sel
动态方法解析如果解析成功就回到第一阶段消息发送
/// 类消息解析
类方法表保存在元类对象里,如果找不到就会去找元类对象的父类,如果还是找不到,会一直继续,直到根元类对象,最后找不到会进行消息转发
- (BOOL)resolveClassMethod:(SEL)sel
3.信息转发
动态方法解析如果失败就会进行消息转发,
(id)forwardingTargetForSelector:(SEL)aSelector
{
if (aSelector == @selector(test)) {
return nil;
}
return [super forwardingTargetForSelector:aSelector];
}
// 方法签名:返回值类型。参数类型
(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
if (aSelector == @selector(test)) {
return [NSMethodSignature signatureWithObjCTypes:"v16@0:8"];
}
return [super methodSignatureForSelector:aSelector];
}
// NSInvocation 封装了一个函数调用。包括:方法调用者,方法,方法参数
// anInvocation.target
// anInvocation.selector
// [anInvocation getArgument:NULL atIndex:0];
(void)forwardInvocation:(NSInvocation *)anInvocation
{
[anInvocation invokeWithTarget:[[Cat alloc] init]];
}
(void)doesNotRecognizeSelector:(SEL)aSelector
{
}
1.一般系统的定时器NSTimer(repeats为YES)和CADisplayLink都会对代理对象隐式强引用,而代理对象如果又强持有了定时器,就会造成循环引用,此时可以采取中间对象的方式来打破循环引用,中间对代理对象弱引用,定时器回调中间对象执行方法的时候,中间对象重写消息转发方法,指定弱引用的代理对象

2.崩溃日志的搜集
网友评论