【发布时间】:2011-10-19 20:05:56
【问题描述】:
objective-c 是否提供了一种方法来拦截对不存在的类方法的调用?
【问题讨论】:
标签: objective-c method-missing
objective-c 是否提供了一种方法来拦截对不存在的类方法的调用?
【问题讨论】:
标签: objective-c method-missing
forwardInvocation 方法是您要使用的方法。当在对象上调用不存在的选择器时会自动调用它。此方法的默认行为是调用doesNotRecognizeSelector:(这是向控制台输出调试信息的方式),但您可以覆盖它做任何您想做的事情。 Apple 推荐的一种方法是让此方法将方法调用转发给另一个对象。
- (void)forwardInvocation:(NSInvocation *)anInvocation
请注意,forwardInvocation 是一项相当昂贵的操作。 NSInvocation 对象需要由框架创建,并且(可选地)用于调用另一个实例上的选择器。如果您正在寻找一种(相对)更快的方法来检测不存在的选择器,那么您可以选择实现 forwardingTargetForSelector。
- (id)forwardingTargetForSelector:(SEL)aSelector
您应该 Apple's documentation 了解如何有效地覆盖这些方法,需要注意一些问题,尤其是在将缺少选择器的同一对象上覆盖 forwardInvocation 方法时。
【讨论】:
+(void)forwardingTargetForSelector:(SEL)sel;+(void)forwardInvocation:(NSInvocation *)anInvocation;后面的函数使用了一个支持函数:+(NSMethodSignature *)methodSignatureForSelector:(SEL)sel;
是的,您可以使用 resolveClassMethod: 类方法(在 NSObject 上定义):
还有一点需要注意(第一次难倒我):http://iphonedevelopment.blogspot.com/2008/08/dynamically-adding-class-objects.html
【讨论】: