9

Objective-c 是否提供了一种拦截对不存在的类方法的调用的方法?

4

2 回答 2

5

forwardInvocation方法是您要使用的方法。当在对象上调用不存在的选择器时会自动调用它。此方法的默认行为是调用doesNotRecognizeSelector:(将调试信息输出到控制台),但您可以覆盖它做任何您想做的事情。Apple 推荐的一种方法是让此方法将方法调用转发给另一个对象。

- (void)forwardInvocation:(NSInvocation *)anInvocation

请注意,这forwardInvocation是一项相当昂贵的操作。NSInvocation 对象需要由框架创建,并且(可选)用于调用另一个实例上的选择器。如果您正在寻找一种(相对)更快的方法来检测不存在的选择器,那么您可以选择实施forwardingTargetForSelector

- (id)forwardingTargetForSelector:(SEL)aSelector

您应该在 Apple 的文档中了解如何有效地覆盖这些方法,有一些需要注意的问题,特别是在覆盖forwardInvocation将缺少选择器的同一对象上的方法时。

于 2011-08-04T10:02:03.357 回答
2

Yes, you can with the resolveClassMethod: class method (which is defined on NSObject):

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

Here is also something to watch out for (stumped me the first time): http://iphonedevelopment.blogspot.com/2008/08/dynamically-adding-class-objects.html

于 2011-08-04T09:53:36.223 回答