Objective-C是否提供了一种拦截调用不存在类方法的方式?
forwardInvocation
方法是您想要使用的方法。当对象上调用不存在的选择器时,它会自动调用该方法。该方法的默认行为是调用doesNotRecognizeSelector:
(这是输出调试信息到控制台的方法),但您可以覆盖它以执行任何您想要的操作。苹果公司推荐的一种方法是让此方法将方法调用转发给另一个对象。- (void)forwardInvocation:(NSInvocation *)anInvocation
forwardInvocation
是一项相当昂贵的操作。框架需要创建一个NSInvocation对象,并(可选地)用于在另一个实例上调用选择器。如果您正在寻找一种(相对)更快的检测不存在选择器的方法,则可以选择实现forwardingTargetForSelector
。- (id)forwardingTargetForSelector:(SEL)aSelector
forwardInvocation
方法时要特别注意一些问题,尤其是需要缺失选择器的情况。请参考:苹果文档。
+(void)forwardingTargetForSelector:(SEL)sel;
+(void)forwardInvocation:(NSInvocation *)anInvocation;
后一个函数使用了一个支持函数:+(NSMethodSignature *)methodSignatureForSelector:(SEL)sel;
- dmitri