1乏盐、當對象接收到無法解讀的消息,就會啟動消息轉發(fā)機制制恍。
// 比如無意中對NSNumber執(zhí)行了NSString的lowercaseString方法
-[__NSCFNumber lowercaseString]: unrecognized selector sent to instance 0xb000000000000012
2父能、開發(fā)者在寫自己的類時,可以轉發(fā)過程中設置掛鉤净神,用以執(zhí)行預定的邏輯何吝,而不應使程序崩潰。
3鹃唯、消息轉發(fā)過程(直到能找到處理對象爱榕,否則crash)
// 3.1.動態(tài)方法解析,看其能否動態(tài)添加方法
+ (BOOL)resolveClassMethod:(SEL)sel;
+ (BOOL)resolveInstanceMethod:(SEL)sel;
// 如果返回NO, 尋找備援接收者,找到返回,找不到返回nil
+ (id)forwardingTargetForSelector:(SEL)selector;
// 3.2.執(zhí)行完整的消息轉發(fā)坡慌,創(chuàng)建NSInvocation對象(未處理的消息的有關全部信息封裝進去)黔酥,有信息派發(fā)中心,把消息指派給目標對象
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)invocation;
4八匠、添加方法
// IMP: 指針函數(shù),指向待添加方法
/* 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)