Objective-C中的打印当前方法

时间:2014-10-02 08:10:38

标签: objective-c reflection methods

如何在Objective-C中打印我所使用的方法的名称?

在Java / C#中我可以使用反射来做到这一点。与Objective-C类似的可能吗?

1 个答案:

答案 0 :(得分:2)

如果只是打印方法名称,请使用

NSLog(@"%@", NSStringFromSelector(_cmd));  

打印方法参数是一项复杂的任务。 ObjectiveC中的每条消息都转换为objMsgSend (id self, SEL, arg0...)
我们需要遍历堆栈并打印出来,正如我们在_cmd + sizeof(SEL)之后看到的那样,我们将地址发送给arg0(但arg0的大小和类型未知)。

Method method = class_getInstanceMethod([self class], _cmd);
unsigned nargs = method_getNumberOfArguments(method);
void *start = _cmd;
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);
}

基本实现应如下所示。

因此,如果参数是对象,那将是很好的(因为我们知道参数的大小是32/64位)。否则我们需要进行类型编码,并按参数的大小移动光标。看看https://github.com/holtwick/HOLog,它完全符合您的要求,但它仅适用于模拟器。