找出函数参数是否是函数调用的一部分

时间:2013-07-09 18:21:03

标签: objective-c

好的,我认为这几乎是不可能的。但是:如果方法作为函数调用的一部分被调用,是否有可能知道方法调用内部?

示例(以及我的实际函数调用):

HDMExpressionSQLSelectBuilder *sb = [[[HDMExpressionSQLSelectBuilder alloc] init] autorelease];
[sb orNestedWhere:[sb where:@"wheraCoumnB" equals:@"whereBEqualValue"], [sb where:@"wheraCoumnB" equals:@"sth"], nil];

从这里发生了两件事:

  • 以任何顺序评估参数(顺序不是 在C标准中指定,它在编译器和。之间发生变化 设置)
  • 尽管这对每个程序员来说都应该是显而易见的:内心的 在
  • 之前评估函数

现在我想知道例如在这个方法中调用...

 [sb where:@"wheraCoumnB" equals:@"whereBEqualValue"]

..它被称为函数参数的一部分。

可能?黑魔法?

在你来之前说我做错了,我应该修改我的代码:我声称我有一个罕见的情况,知道这样的事情是有意义的。我正在编写一个查询构建器,这将大大简化嵌套条件的使用。否则我必须做一些愚蠢的nestedAndBegin和后来的nestedAndEnd以实现括号,依此类推。在这种情况下会很尴尬,我的查询构建器是基于树的,我不想这样做(与字符串杂耍查询构建器不同,所有需要的是将逻辑表达式的节点放在适当的位置)。

更新

所以这不足为奇。对于那些有兴趣我是如何为我的特定问题解决这个问题的人:我已经完成了所有对函数的调用都是延迟的,所以对我的查询构建器的函数的调用将带有函数参数的方法调用对象放到调用列表中。它当时不执行任何方法代码。 每个调用对象都有一个auto-inc序列Id,所以我知道什么时候评估了一个函数。现在在nestedAnd等函数中(所以那些我的问题所涉及的函数)我检查存储的调用对象的序列Id是否对应于函数调用的参数索引。如果没有,这是重新排序它们的正确时间。

然后推迟语法检查和查询构建阶段,直到用户实际调用query()方法(或ast()来获取表达式树。)

1 个答案:

答案 0 :(得分:3)

不,没有(实际)方法可以做到这一点。

理论上,您可以在方法中添加一些代码,从您的二进制文件中读取调试符号,检查链接寄存器,然后使用该信息找出调用站点,从其他地方加载源代码,以及找出映射,解析源代码,并确定它是在你描述时被调用的。