我正在努力通过外观类转发类方法。
为了澄清,我重写了以下所有方法:
-(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
类方法呢?
如有任何帮助,我们将不胜感激。
最佳答案
因此,您已经知道要使对象为实例方法执行 forwardInvocation
,您必须实现实例方法 -forwardInvocation:
和 -methodSignatureForSelector:
(其他的是不必要的)。好吧,类方法只是类对象上的方法。类是对象并且像任何其他对象一样工作,并且支持根类(在本例中为 NSObject
)的所有实例方法。
Objective-C 运行时不关心对象是类对象还是非类对象。消息转发机制是一样的。因此,当您向对象发送消息时,无论它是什么,如果它找不到它,它只会查找对象上的 forwardInvocation:
和 methodSignatureForSelector:
方法.所以你需要在你的类对象上有这些方法。
即实现类方法 +forwardInvocation:
和 +methodSignatureForSelector:
关于objective-c - -forwardInvocation 用于类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11551086/