消息转发以及实际开发中的用途

OC中的方法调用,其实都是转化成objc_msgSend函数调用

1.信息发送

消息转发以及实际开发中的用途_第1张图片
image.png

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和CADisplayLink会对代理对象强引用,而代理对象如果又强持有了定时器,就会造成循环引用.
(1).此时可以采取中间对象的方式来打破循环引用,中间对象对代理对象弱引用,定时器回调中间对象执行方法的时候,中间对象重写消息转发方法,指定弱引用的代理对象


消息转发以及实际开发中的用途_第2张图片
image.png

(2).使用NSProxy类
2.崩溃日志的搜集

你可能感兴趣的:(消息转发以及实际开发中的用途)