将方法的所有参数传递给NSLog

时间:2009-11-25 16:03:27

标签: objective-c cocoa-touch cocoa reflection arguments

我使用NSLog()将某些内容打印到控制台。有没有办法将所有当前方法的参数传递给NSLog()或任何其他函数或方法,而无需明确地查看每个参数?

例如,当我将LOGME放入代码中时,我已经有一个宏向控制台输出有用的信息。宏将创建对单例类的logging-method的调用,并传递一些有用的东西,如_cmd和其他东西。

我还想捕获该方法的所有参数并传递它们以自动打印出来。这可能吗?

2 个答案:

答案 0 :(得分:3)

没有办法解决预处理器或Objective-C中的所有参数。

我所知道的唯一方法是使用调试器。您可以在Xcode中添加断点操作以轻松完成此操作。右键单击代码窗口的最左列,选择“内置断点” - > “记录断点和参数并自动继续”。

答案 1 :(得分:3)

使用gdb。您可以设置一个断点,将参数记录到方法并继续。

如果你坚持这么做的话......当然不是很简单,但你可以在给定的架构/ ABI上使用堆栈结构,并利用Objective-C运行时来计算出多少参数和要寻找什么尺寸。从现在开始,我处于未知领域;我从来没有这样做,也不会打扰。所以YMMV ......

在您的方法中,您可以获取Method结构,然后获取参数数量,然后获取每个参数类型及其大小。然后你可以从self参数的地址(即&self)走出堆栈,假设你知道你在做什么......

Method method = class_getInstanceMethod([self class], _cmd);
unsigned nargs = method_getNumberOfArguments(method);
void *start = &self;
for(unsigned i = 0; i<nargs; i++) {
  char *argtype = method_copyArgumentType(method, i);
  //find arg size from argtype
  // walk stack given arg zie
  free(argtype);
}

在此过程中,您必须将argtype字符串(使用Objective-C type encodings)转换为堆栈中每个参数的大小。

当然,您必须为每种类型派生格式字符串,并使用包含参数的适当变量参数数组调用NSLogv,从其在堆栈上的位置复制。可能比它的价值更多的工作。使用调试器。