-forwardInvocation类方法

时间:2012-07-18 22:08:09

标签: objective-c nsobject message-forwarding

我正在努力通过Facade类转发类方法。

为了澄清,我推翻了以下所有方法:

-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
-(void)forwardInvocation:(NSInvocation *)anInvocation
+(BOOL)instancesRespondToSelector:(SEL)aSelector
+(NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector
+(IMP)instanceMethodForSelector:(SEL)aSelector
+(BOOL)resolveClassMethod:(SEL)sel
+(BOOL)resolveInstanceMethod:(SEL)sel

..然而,对于类方法,唯一要调用的是+resolveClassMethod。从那里,无论我是否返回YES,我都会立即得到一个无法识别的选择器异常。

发生了什么事? 类消息转发与实例消息转发的工作方式不同吗? 同样,为什么没有+forwardInvocation类方法?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

所以你已经知道,要使对象为实例方法做forwardInvocation,你必须实现实例方法-forwardInvocation:-methodSignatureForSelector:(其他方法是不必要的)。那么,类方法只是类对象的方法。类是对象并且像任何其他对象一样工作,并且支持根类的所有实例方法(在这种情况下为NSObject)。

Objective-C运行时并不关心对象是类对象还是非类对象。消息转发机制是相同的。因此,当您向对象发送消息时,无论它是什么,并且找不到它,它只会在对象上查找forwardInvocation:methodSignatureForSelector:方法。所以你需要在类对象上使用这些方法。

即。实现类方法+forwardInvocation:+methodSignatureForSelector:

相关问题