11.理解消息转发机制

1、当对象接收到无法解读的消息,就会启动消息转发机制。

//  比如无意中对NSNumber执行了NSString的lowercaseString方法
-[__NSCFNumber lowercaseString]: unrecognized selector sent to instance 0xb000000000000012

2、开发者在写自己的类时,可以转发过程中设置挂钩,用以执行预定的逻辑,而不应使程序崩溃。

3、消息转发过程(直到能找到处理对象,否则crash)

//  3.1.动态方法解析,看其能否动态添加方法
+ (BOOL)resolveClassMethod:(SEL)sel;
+ (BOOL)resolveInstanceMethod:(SEL)sel;
//  如果返回NO, 寻找备援接收者,找到返回,找不到返回nil
+ (id)forwardingTargetForSelector:(SEL)selector;
//  3.2.执行完整的消息转发,创建NSInvocation对象(未处理的消息的有关全部信息封装进去),有信息派发中心,把消息指派给目标对象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)invocation;

4、添加方法

//  IMP: 指针函数,指向待添加方法
/*  types:待添加方法类型编码
 *  void run(id self, SEL _cmd)对应为 class_addMethod(self, sel, (IMP)run, "v@:");
 *  类型编码含义如下:
    v : 返回void值
    @ : id(self)
    : : SEL(_cmd)
    @ : id(value)
 */
OBJC_EXPORT BOOL class_addMethod(Class cls, SEL name, IMP imp,
                                 const char *types)

你可能感兴趣的:(11.理解消息转发机制)