iOS开发首发本文:)
我们知道常规的block调用都是硬编码写死,参数类型必须在编译时匹配,编译器会转换成struct与C函数指针,比如下代码:
id anyBlock = sumBlock;
anyBlock(1, 2, 3);
必须做强制转换才能编译通过:
id anyBlock = sumBlock;
((int (*)(int, int, int))anyBlock)(1, 2, 3);
而JavascriptCore可以很简单的设置任意数据类型的block, 让js调用. 比如:
我们把JavascriptCore源码拿下来, 看看究竟做了什么?获取block的signature->设置target为block->设置参数->invoke
我们按照这个思路写一段代码试试:
有了NSInvocation调用block,我们就可以实现在lua、js等脚本语言中调用获取到的任意OC block了!大致流程如下:
作者介绍:尹峥伟 (花名:君展) 资深iOS开发工程师,就职于阿里巴巴无线事业部,主要负责手机淘宝的基础架构研发。
版权申明: