objective-c - -forwardInvocation 用于类方法

标签 objective-c nsobject message-forwarding

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

为了澄清,我重写了以下所有方法:

-(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/

相关文章:

ios - Xcode 不再识别对象

objective-c - 我怎样才能通过消息转发将 "swallow"发送到 "unrecognized selector error"?

ios - 无法在类初始值设定项中生成 NSUUID - Apple Mach-O 链接器错误

objective-c - 如何在 cocoa 中做稀疏数组

macos - 是否可以强制控制 NSWindowController 子类?

objective-c - Objective C 中的消息转发

iphone - iOS——使用宏转发一堆消息?

ios - 我可以使用 Core Bluetooth 打开 Objective-c 中关闭的应​​用程序吗?

iphone - ScrollView 为圆形

ios - 从 NSObject 重新加载 UITableView