objective-c中类似method_missing的功能(即运行时的动态委派)

smt*_*ire 1 iphone reflection delegation dynamic objective-c

我正在尝试动态地(在运行时)将一个方法调用转换为另一个方法调用.

例如,我想要以下内容:

[obj foo]
Run Code Online (Sandbox Code Playgroud)

委托:

[obj getAttribute: @"foo"]
Run Code Online (Sandbox Code Playgroud)

(我想动态地这样做,因为我事先不知道这些方法名称或属性是什么).

我看到有一个钩子:

 - (id) forwardingTargetForSelector: (SEL) aSelector
Run Code Online (Sandbox Code Playgroud)

但是,这似乎只适用于委托,我希望将对象保持为"self"并转换方法参数.

我应该在哪里寻找这种行为?在obj-c中甚至可能吗?

Lil*_*ard 6

您可以使用该方法-forwardInvocation:.它需要一个NSInvocation表示方法调用的完整对象,您可以根据需要处理它.如果这样做,您还应该覆盖-methodSignatureForSelector:以返回正确的NSMethodSignature(-forwardInvocation:处理未知选择器所需的).还建议您覆盖-respondsToSelector:以声明您可以处理有问题的选择器.