2012-07-18 56 views
3

我正努力通过一个facade类转发一个类方法。-forward类方法的调用

要澄清,我重写所有下面的方法:

-(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类方法?

任何帮助将不胜感激。

回答

6

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

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

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

+0

我不能看到'+ forwardInvocation:'方法在NSObject的协议 – 2014-06-27 12:32:04

+0

@JulianKról:'-forwardInvocation:'是在NSObject类。 – newacct 2014-06-27 18:17:12

+0

好,但你在回答'+ forwardInvocation'中提到,这就是为什么我评论 – 2014-06-27 18:32:16