iOS 通过反射的方式调用目标函数

1. 目标

工作中,需要解决这样一种问题,测试每一个目标接口的调用时间和返回值。逻辑较为通用,所以想使用反射来实现这种功能。

2. 背景知识

网上查了下,发现反射有两种实现方式,分别为 runtime中的objc_msgSend 和 NSInvocation。

具体可参考这篇文章:https://www.jianshu.com/p/ce00728204ed?utm_campaign

试用了下,发现可以实现函数调用,但不太好额外加入其他逻辑,所以不太适用于解决我的问题。

具体可参考这篇文章:https://juejin.cn/post/6844903542851895304 (虽然文中提到了NSProxy,但看实际代码里并未使用到) 和 https://ace.re/2017/objective-c-nsinvocation.html

试用了下,发现基本可以达成我的目标。但有一个问题,系统提供的performSelector函数,最多仅支持传两个参数。这显然是不够的。所以我们需要把这块优化下。我尝试了两种解决方式。

具体可参考这个篇文章:https://blog.csdn.net/a158337/article/details/50915245

具体可参考这篇文章:https://www.jianshu.com/p/1dc0d05cb766。基本可用,但文章中获取返回值处需要优化下。看网上的说法,文章中获取返回值处可能会造成崩溃。

3. 我的实现

3.1 使用可变参数传参

调用方法:

4. 待优化的问题

此方法可适用于大多数场景,但有些地方仍不尽如人意。其中之一,就是传参必须是NSObject的子类。如果是C++的类,就传不进去。因为无法将其转为id。其二,不能方便的调用C语法的函数。只有成员方法或类方法,可以这样方便的调用。若开发中需调用的接口为C语法的接口,则调用起来会麻烦很多,不如将C语法的接口,包装成OC的风格。

Original: https://www.cnblogs.com/sunada2005/p/14292160.html
Author: myLittleGarden
Title: iOS 通过反射的方式调用目标函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543213/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球