Objective C和类中的魔法方法

9

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

2个回答

5
forwardInvocation方法是您想要使用的方法。当对象上调用不存在的选择器时,它会自动调用该方法。该方法的默认行为是调用doesNotRecognizeSelector:(这是输出调试信息到控制台的方法),但您可以覆盖它以执行任何您想要的操作。苹果公司推荐的一种方法是让此方法将方法调用转发给另一个对象。
- (void)forwardInvocation:(NSInvocation *)anInvocation

请注意,forwardInvocation是一项相当昂贵的操作。框架需要创建一个NSInvocation对象,并(可选地)用于在另一个实例上调用选择器。如果您正在寻找一种(相对)更快的检测不存在选择器的方法,则可以选择实现forwardingTargetForSelector
- (id)forwardingTargetForSelector:(SEL)aSelector

你应该查看苹果文档,了解如何有效地覆盖这些方法。在覆盖同一对象上的forwardInvocation方法时要特别注意一些问题,尤其是需要缺失选择器的情况。请参考:苹果文档

1
类方法转发机制需要使用类方法,而不是实例方法。 +(void)forwardingTargetForSelector:(SEL)sel; +(void)forwardInvocation:(NSInvocation *)anInvocation;后一个函数使用了一个支持函数: +(NSMethodSignature *)methodSignatureForSelector:(SEL)sel; - dmitri

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接