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)
网友评论