3

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

为了澄清,我将覆盖以下所有方法:

-(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 还是 NO,我都会立即得到一个无法识别的选择器异常。

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

任何帮助将不胜感激。

4

1 回答 1

6

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

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

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

于 2012-12-14T06:47:31.207 回答