2010-04-22 49 views
13

我试图调试我正在工作的iPhone应用程序,并且向各种源文件添加五十个NSLog语句的想法给了我意志。有什么办法来问一个方法的名字?

我想要做的是写一对语句,说

NSString *methodName = [self methodName]; 
NSLog(@"%@", methodName); 

,我可以只粘贴到每个我需要的方法。有没有办法做到这一点?是否有一些Objective-C构造用于询问方法的名称?或者我会不得不这么做?

+0

这是一个确切的dup http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873它有一个更完整的答案。 – Ken 2010-05-05 03:20:12

+0

@Ken我知道这是晚了5年,但我认为你的链接是不正确的。它应该指向http://stackoverflow.com/questions/969130/how-to-print-out-the-method-name-and-line-number-and-conditional-disable-nslog?lq=1 – 2015-06-13 13:16:35

回答

22

尝试NSLog(@"%s", __func__)。这会打印出一个漂亮的描述,如-[MyView drawRect:]

这也适用于函数。这是一个编译器功能。

+2

'__func__'是C99语言功能。它的堂兄'__FUNCTION__'和'__PRETTY_FUNCTION__'是GCC和其他编译器提供的语言扩展。我相信这三者都是C++语言的扩展。 – 2010-04-23 01:37:52

+0

http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 – Ken 2010-05-05 03:24:33

11

用途:NSLog("%@", NSStringFromSelector(_cmd));

_cmd是传递给就像self每一个方法,它是导致要调用的方法选择(基本方法的名称和签名)的参考的特殊变量。

+1

'NSLog (“%s”,_cmd);' SEL是一个C字符串。 – drawnonward 2010-04-22 03:41:53

+6

@drawnonward是的,从技术上讲是,但使用正确的转换函数仍然很好。 – 2010-04-22 04:07:55

+9

@drawnonward:它被实现为一个,是的,但它被定义为不透明类型。苹果公司是臭名昭着的交换这样的东西从你下面,所以使用它作为记录,无论它如何实际执行。 – 2010-04-22 04:24:14

2

这是你想要什么:

NSLog(@"%s", __PRETTY_FUNCTION__); 

有关相关记录的东西更多信息,请阅读过这个问题的答案:How to print out the method name and line number and conditionally disable NSLog?

+1

'__func__'做同样的事情(在目前所有的Mac OS X编译器),并保证由C99存在。另外,不要使用'%@',因为'__PRETTY_FUNCTION__'和'__func__'都是C字符串,而不是NSString对象。 – 2010-04-22 05:14:20

+0

感谢您指出%@错误(我已经修复了错误)。对于Obj-C方法,C函数和C++函数,'__func__'是否返回与__PRETTY_FUNCTION__相同的东西?我认为'__PRETTY_FUNCTION__'为C函数提供了更多信息,比如参数名称或其他? – 2010-04-22 05:30:46

+0

在GCC 4.2.1和Clang中,两个标识符在Objective-C方法(' - [MyClass selector]')和C函数('nameoffunc')中具有相同的值。我没有测试C++,因为我不知道C++ .. – 2010-04-22 19:50:44

4

我用下面的宏频繁:

#if DEBUG 
# define LOG(format, args ...) fprintf(stderr, format "\n", ## args) 
# ifdef __cplusplus 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __PRETTY_FUNCTION__, __FILE__, __LINE__, ## args) 
# else 
# define ERR(format, args ...) fprintf(stderr, "[%s] (%s:%i): " format "\n", __func__, __FILE__, __LINE__, ## args) 
# endif 
#else 
# define LOG(format, args ...) 
# define ERR(format, args ...) 
#endif 

如果你总是想要的功能名称,你可以很容易地适应他们的要求。

相关问题