Objective c 什么决定了解决未实现方法的过程?
据我所知,一个未实现的方法通过以下方式得到解决:Objective c 什么决定了解决未实现方法的过程?,objective-c,cocoa,objective-c-runtime,Objective C,Cocoa,Objective C Runtime,据我所知,一个未实现的方法通过以下方式得到解决: resolveInstanceMethod:/resolveClassMethod:获得实现该方法的机会 ForSelector转发目标:获得转发给代理的机会 forwardInvocation:获得处理方法的机会 这三步流程在哪里定义?我想自己处理,因为NSInvocation对我来说可能太重了。我对运行时源代码进行了一番探索,但实际上什么都看不到 看起来旧的运行时会在接收器上调用forward:args:来执行此操作,但这似乎与新的运行时有所
id对象(id对象、SEL消息等)代码>
我不为Apple工作,所以我不知道基金会是如何实现这一点的,但至少在CuCONTRON的情况下,他们使用:
id objc_msgForward(id object,SEL message,...)
{
Class class=object->isa;
struct objc_method *method;
void *arguments=&object;
if((method=class_getInstanceMethod(class,@selector(forwardSelector:arguments:)))!=NULL)
return method->method_imp(object,@selector(forwardSelector:arguments:),message,arguments);
else
{
OBJCRaiseException("OBJCDoesNotRecognizeSelector","%c[%s %s(%d)]", class_isMetaClass(class) ? '+' : '-', class->name,sel_getName(message),message);
return nil;
}
}
添加一个forwardSelector:arguments:
方法似乎不起作用,所以我猜这是Cocotron特有的。有人知道基础< <代码> ObjcxMSGOPEN//>在基础?中是什么?
我写的东西有点像
使用消息的脚本语言
转发到与的接口
目的-c。现在,我正在使用
NSInvocation,但它可能会结束
每天这样做数千次
第二,因此开销将是
值得注意的但我想我也只是
好奇
就消息转发而言,在不同的平台和运行时版本中,行为[通常微妙地]有所不同
无论如何,不要重新发明轮子。现在有两种语言桥接器非常接近于完全逼真的桥接,您可以从中学习很多。两者都有专门允许此类重复使用的自由许可证
具体来说,MacRuby项目提供了一个位于CoreFoundation和Objective-C垃圾收集器之上的Ruby实现。它是可用的“最原生”的桥接器(因此不具有非常好的可移植性——这不是项目的目标)
PyObjC桥是Objective-C运行时和另一种动态OO语言运行时之间高保真桥的最佳示例;python它的可移植性更强一些,尽管非MacOSX的部分可能已经有些过时了
(我不提F-Script是一种建立在Objective-C基础上的新语言,我相信它的源代码是可用的,这是失职的。)
所有的网桥都处理方法转发、子类化和跨运行时代理,所有这些听起来都适用于您的特定需求。您的需求是什么,为什么您认为NSInvocation
对它们来说太重了?我建议不要重新发明轮子,除非你已经明确发现NSInvocation
正在减慢你的速度。我写的东西有点像脚本语言,它使用消息转发与objective-c接口。现在,我使用的是NSInvocation,但它可能每秒执行数千次,因此开销会很明显。但我想我也很好奇……FWIW,objc_msgForward()是根据目标平台/体系结构在汇编中实现的:F-Script的源代码在同一个.zip文件中,该文件包含二进制发行版本。GitHub上也提供了F-Script源代码:Good call。我没想到。