NSInvocation动态调用任意block

iOS开发首发本文:)


我们知道常规的block调用都是硬编码写死,参数类型必须在编译时匹配,编译器会转换成struct与C函数指针,比如下代码:

0?wx_fmt=png0?wx_fmt=png

id anyBlock = sumBlock;
anyBlock(1, 2, 3);

必须做强制转换才能编译通过:

id anyBlock = sumBlock;
((int (*)(int, int, int))anyBlock)(1, 2, 3);

而JavascriptCore可以很简单的设置任意数据类型的block, 让js调用. 比如:0?wx_fmt=png0?wx_fmt=png0?wx_fmt=png


我们把JavascriptCore源码拿下来, 看看究竟做了什么?0?wx_fmt=png0?wx_fmt=png获取block的signature->设置target为block->设置参数->invoke


我们按照这个思路写一段代码试试:0?wx_fmt=png


有了NSInvocation调用block,我们就可以实现在lua、js等脚本语言中调用获取到的任意OC block了!大致流程如下:


作者介绍:尹峥伟 (花名:君展) 资深iOS开发工程师,就职于阿里巴巴无线事业部,主要负责手机淘宝的基础架构研发。

版权申明:

0?wx_fmt=bmp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值