我正在努力通过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
类方法?
非常感谢任何帮助。
答案 0 :(得分:6)
所以你已经知道,要使对象为实例方法做forwardInvocation
,你必须实现实例方法-forwardInvocation:
和-methodSignatureForSelector:
(其他方法是不必要的)。那么,类方法只是类对象的方法。类是对象并且像任何其他对象一样工作,并且支持根类的所有实例方法(在这种情况下为NSObject
)。
Objective-C运行时并不关心对象是类对象还是非类对象。消息转发机制是相同的。因此,当您向对象发送消息时,无论它是什么,并且找不到它,它只会在对象上查找forwardInvocation:
和methodSignatureForSelector:
方法。所以你需要在类对象上使用这些方法。
即。实现类方法+forwardInvocation:
和+methodSignatureForSelector: