當調(diào)用對象的某個方法的時候, 如果在當前類中沒有找到此方法, 那么就到當前類的父類中去尋找, 如果在父類中沒有找到, 那么就去父類的父類中去尋找, 一直找到 NSObject 都沒有這個方法, 就會報 Unrecognized selector 的異常.
但是在這之前, objc 的運行時會給出三次拯救程序崩潰的機會.
第一次: 動態(tài)添加一個新方法并執(zhí)行的機會
+ (bool)resolveInstanceMethod:(sel)sel{
}
當系統(tǒng)第一次找不到某個方法的時候, 會自動調(diào)用這個方法, 用來給程序添加一個新方法并執(zhí)行的機會.
第二次: 當系統(tǒng)調(diào)用上一個方法后未能實現(xiàn)添加新的方法, 則系統(tǒng)會再來調(diào)用下面的這個方法, 這個方法是系統(tǒng)提供的一個將 SEL 轉(zhuǎn)給其他對象的機會
- (id)forwardingTargetForselector:(sel)aselctor{
}
**第三次: 當 forwardingTargetForselector 返回的 nil 或者 self 時, 會進入到這個方法, 這個方法是拯救程序的最后一步.
這個方法用來返回一個方法簽名, 在由后面的 forwardInvocation: 去執(zhí)行 **
- (NSMethodSigature *)methodSignatrueForseletor:(sel)aselector{
}
如果上面的方法不返回 nil, 則會來到這個方法里具體執(zhí)行
-(void)forwardInvocation:(NSInvocation *)anInvocation{
在這里會調(diào)用自己對象的其他方法, 也可以調(diào)用其他函數(shù)
甚至還可以調(diào)用多個不同對象的多個方法
}