Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么决定了解决未实现方法的过程?_Objective C_Cocoa_Objective C Runtime - Fatal编程技术网

Objective c 什么决定了解决未实现方法的过程?

Objective c 什么决定了解决未实现方法的过程?,objective-c,cocoa,objective-c-runtime,Objective C,Cocoa,Objective C Runtime,据我所知,一个未实现的方法通过以下方式得到解决: resolveInstanceMethod:/resolveClassMethod:获得实现该方法的机会 ForSelector转发目标:获得转发给代理的机会 forwardInvocation:获得处理方法的机会 这三步流程在哪里定义?我想自己处理,因为NSInvocation对我来说可能太重了。我对运行时源代码进行了一番探索,但实际上什么都看不到 看起来旧的运行时会在接收器上调用forward:args:来执行此操作,但这似乎与新的运行时有所

据我所知,一个未实现的方法通过以下方式得到解决:

  • resolveInstanceMethod:/resolveClassMethod:获得实现该方法的机会
  • ForSelector转发目标:获得转发给代理的机会
  • forwardInvocation:获得处理方法的机会
  • 这三步流程在哪里定义?我想自己处理,因为NSInvocation对我来说可能太重了。我对运行时源代码进行了一番探索,但实际上什么都看不到

    看起来旧的运行时会在接收器上调用forward:args:来执行此操作,但这似乎与新的运行时有所不同。我猜这个过程必须由框架而不是运行时来定义,因为如果运行时依赖Cocoa以至于需要NSInvocation来处理消息,那就很奇怪了。是否可能是在NSObject/NSProxy上调用的未记录方法

    编辑:

    它看起来像是运行时声明但从未定义一个C函数,当objc_msgSend找不到实现时调用该函数:

    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。我没想到。