IMP 类型在目标C表示功能的指针,因为到目前为止,我以理解的。是否有任何方法来做一个 IMP 从一个方框指针?谢谢你的想法。

有帮助吗?

解决方案

由于这是书面还是现在API在iOS和Mac OS X,允许块变成小鬼。我写了一个 志后 描述API(imp_implementationWithBlock()).


一块是有效的结构,包含一点点的元数据,参照编码包含在块和一份const-复制的数据的捕获在块。

因此,没有,有没有办法直接地图之间的一个 IMP 和一块参考。

当叫到一块的汇编、编译器发射的一个蹦床,设立堆框架,然后跳到的可执行代码内。

你可以做什么,不过,是创建一个小鬼就像是蹦床。以下,你会需要一个特定进口的每个设定的参数和返回的类型被称为。如果你需要作出这种通用的,则需要使用大会。

为此,我设立了独特的方框中的实例每类实例。如果你想有一个通用框行为在所有情况下,建立一个哈希 SEL ->的框每类。

(1)准块作为IMPs使用相关的参考机构。是这样的:

void (^implementingBlock)(id s, SEL _c, int v) = ^(id s, SEL _c, int v) {
     // do something here
}

objc_setAssociatedObject(obj, SELToImp, [implementingBlock copy]));

(2)实施一个蹦床进口这样的事情:

void void_id_sel_intTramp(id self, SEL _cmd, int value) {
    int (^block)(id s, SEL _c, int v) = objc_getAssociatedObject(self, _cmd);
    block(self, _cmd, value);
}

(3)东西上面蹦床在任何选择通过的目标-C runtime的API(见 method_setImplementation 像)

注意事项:

  • 这是输入计算器.真正的代码会相似,但可能略有不同。

  • 该[implementingBlock复制]是至关重要;块开始生活在叠层(通常)

其他提示

我相信Mike Ash在Landon Fuller的帮助下已经解决了这个问题,包括iOS,这个问题更难实现。他有一个关于 github 的课程,它将把一个块变成一个函数指针。

您可能还想提供公告和一些关于可可未绑定的有趣的后续讨论。

更新:现在有 imp_implementationWithBlock(),如上所述。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top