Chr*_*eux 6 cocoa objective-c objective-c-runtime
据我了解,未实现的方法通过以下方式解决:
这个三步流程定义在哪里?我想自己处理它,因为NSInvocation可能对我的需求来说太重了.我有一个围绕运行时源,并没有真正看到任何东西.
它看起来像旧的运行时会调用前进:args:在接收器上,这样做但似乎已经从新的运行时.我猜这个过程必须由框架而不是运行时定义,因为如果运行时依赖于Cocoa到需要NSInvocation来处理消息的程度,那就太奇怪了.是否可能是在NSObject/NSProxy上调用的无证方法?
编辑:
它看起来像运行时声明,但从未定义,当objc_msgSend找不到实现时调用的C函数:
id objc_msgForward(id object,SEL message,...);
我不为Apple工作,所以我不知道Foundation如何实现这一点,但至少在Cocotron的情况下,他们使用:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
添加forwardSelector:arguments:方法似乎不起作用,所以我猜这是特定于Cocotron.有人知道objc_msgForward基金会做了什么吗?
我写的东西有点像脚本语言,它使用消息转发来与objective-c接口.现在,我正在使用NSInvocation,但它最终可能每秒数千次,所以开销会很明显.但我想我也只是好奇......
就消息转发而言,不同平台和运行时版本之间的行为[通常略有不同].
无论如何,不要重新发明轮子.今天有两种语言桥可以完全接近全保真桥接,你可以从中学到很多东西.两者都有自由许可,专门允许这种重复使用.
具体来说,MacRuby项目提供了一个位于CoreFoundation和Objective-C垃圾收集器之上的Ruby实现.它是"最本土"的桥梁(并且因此不是非常便携 - 不是项目的目标).
PyObjC桥是Objective-C运行时和另一个动态OO语言运行时之间高保真桥的最佳示例; 蟒蛇.它有点便携,虽然非Mac OS X位可能有点腐烂.
(我不会提到F-Script;一种基于Objective-C构建的新语言,我相信,源代码是可用的吗?)
所有的桥都处理方法转发,子类化和跨运行时代理,所有这些都听起来适用于您的特定需求.
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |