从Objective-C块创建IMP

从Objective-C块创建IMP,第1张

概述Objective-C中的IMP类型表示一个函数指针,据我所知。有没有办法从块指针中创建IMP?谢谢你的想法 由于这是写的,现在在iOS和Mac OS X中有API,允许将块直接转换为IMP。我写了一个描述API(imp_implementationWithBlock())的 weblog post。 块实际上是一个包含一些元数据,对块中包含的代码的引用以及在块内捕获的常量复制数据的副本的结构。 Objective-C中的IMP类型表示一个函数指针,据我所知。有没有办法从块指针中创建IMP?谢谢你的想法解决方法 由于这是写的,现在在iOS和Mac OS X中有API,允许将块直接转换为IMP。我写了一个描述API(imp_implementationWithBlock())的 weblog post。

块实际上是一个包含一些元数据,对块中包含的代码的引用以及在块内捕获的常量复制数据的副本的结构。

因此,不,没有办法直接映射IMP和Block参考。

当编译一个块的调用时,编译器发出一个设置堆栈帧的蹦床,然后跳转到块内的可执行代码。

然而,您可以做的是创建一个像蹦床一样的IMP。对于以下内容,您将需要每个参数&返回要调用的类型。如果你需要这个泛型,你需要使用程序集。

为此,我正在为该类的每个实例设置唯一的块实例。如果你想有一个通用的块,在所有的实例之间的行为,建立一个散列的SEL – >每班班

(1)使用关联的引用机制将块作为IMP进行关联。就像是:

voID (^implementingBlock)(ID s,SEL _c,int v) = ^(ID s,int v) {     // do something here}objc_setAssociatedobject(obj,SELToImp,[implementingBlock copy]));

(2)实施蹦床IMP这样:

voID voID_ID_sel_intTramp(ID self,SEL _cmd,int value) {    int (^block)(ID s,int v) = objc_getAssociatedobject(self,_cmd);    block(self,_cmd,value);}

(3)通过Objective-C运行时的API将上述蹦床填入任何选择器(参见method_setImplementation等)

注意事项:

>这是打入StackOverflow。真正的代码将是类似的,但可能稍有不同。> [implementationBlock copy]是至关重要的;阻止在堆栈上启动生命(通常)

总结

以上是内存溢出为你收集整理的从Objective-C块创建IMP全部内容,希望文章能够帮你解决从Objective-C块创建IMP所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1039231.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存