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

2019-01-09  本文已影响10人  萝卜酱紫

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

1.信息发送

image.png

2.动态方法解析

/// 对象消息解析
对象方法表保存在类对象里,如果找不到就会去找类对象的父类,如果还是找不到,会一直继续,直到根类对象,最后找不到会去根元类对象寻找(我记得会去根元类对象寻找),还是没找到会进行消息转发

/// 类消息解析
类方法表保存在元类对象里,如果找不到就会去找元类对象的父类,如果还是找不到,会一直继续,直到根元类对象,最后找不到会进行消息转发

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


image.png

2.崩溃日志的搜集

上一篇 下一篇

猜你喜欢

热点阅读