2012-07-18 96 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