我使用NSLog()
将某些内容打印到控制台。有没有办法将所有当前方法的参数传递给NSLog()
或任何其他函数或方法,而无需明确地查看每个参数?
例如,当我将LOGME
放入代码中时,我已经有一个宏向控制台输出有用的信息。宏将创建对单例类的logging-method的调用,并传递一些有用的东西,如_cmd
和其他东西。
我还想捕获该方法的所有参数并传递它们以自动打印出来。这可能吗?
答案 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
,从其在堆栈上的位置复制。可能比它的价值更多的工作。使用调试器。