动态方法在运行时调用

时间:2014-06-24 20:38:10

标签: ios objective-c dynamic methods runtime

我的项目将使用一堆遗留代码进行编译(作为> 100个独立方法)。所有不同的遗留方法都会在我的项目中起到同样的作用,他们只是采用不同的方式。也就是说,它们都具有大致相同的输入和相同的输出,但是它们进行一些非常复杂的计算以获得这些输出,并且这些计算在不同方法之间可以变化很大。我希望只需要在给定会话期间调用其中一个方法,但下一个会话可能需要调用另一个方法。在我的项目中,当我打算调用其中一种方法时,用户将输入足够的信息以便我能够确定要调用哪种方法。

我可以处理这种情况的一种方法是使用巨大的if块。我不得不检查几个不同的条件。对于每种条件组合,我会调用另一种遗留方法。这种方法的问题在于从可读性的角度来看会非常糟糕 - 实际的if块最终可能会长达100行。我想也可能存在许多不同的else-if语句的性能问题。

我想要做的是创建一个查找表,在其中我存储要调用的方法的名称(作为字符串),并将其与我需要检查的不同条件配对。我的公司正试图将其政策转向使用更多的查找表和更少的if块。

有没有办法根据我从查找表中获取的“方法名称”字符串调用方法?如果是这样,那么做这样的事情会是什么样的语法?或者还有其他(更好的)方法来处理这个我没有想过的方法吗?或者,巨大的if块实际上更符合最佳实践?

1 个答案:

答案 0 :(得分:0)

NSInvocation可能适合您的需求。本质上,它允许您从选择器创建方法调用,然后稍后调用它。您可以使用NSSelectorFromString根据您查找的字符串创建选择器。有一篇关于NSInvocation的优秀教程,我刚刚为http://a-coding.com/making-nsinvocations/添加了书签。

我不确定其他方法可以实现您的目标,但我可以想象这种方法难以调试和跟踪,但有时您在实施之前就不会知道。

我使用NSInvocation一次将应用程序置于“演示”模式。我创建了一个完整的NSSInvocations数组,然后每当我的计时器函数触发时,我会抓住下一个调用并调用它,允许我的应用程序像某人正在使用它一样。无论如何好运。