我正在尝试调试一个iPhone应用程序,但是在各个源文件中添加五十个NSLog语句的想法让我感到不安。
我想做的是编写一对语句,例如
NSString *methodName = [self methodName];
NSLog(@"%@", methodName);
我希望能够将一段代码复制粘贴到需要的每个方法中。有没有一种方法可以做到这一点?是否有一种Objective-C结构可以询问方法的名称?还是我必须走弯路?
我正在尝试调试一个iPhone应用程序,但是在各个源文件中添加五十个NSLog语句的想法让我感到不安。
我想做的是编写一对语句,例如
NSString *methodName = [self methodName];
NSLog(@"%@", methodName);
我希望能够将一段代码复制粘贴到需要的每个方法中。有没有一种方法可以做到这一点?是否有一种Objective-C结构可以询问方法的名称?还是我必须走弯路?
尝试使用NSLog(@"%s", __func__)
。这将打印出一个很漂亮的描述,例如-[MyView drawRect:]
。
这也适用于函数。这是一个编译器特性。
__func__
是C99语言的一个特性。它的近亲__FUNCTION__
和__PRETTY_FUNCTION__
是由GCC和可能其他编译器提供的语言扩展。我相信这三个都是C++语言的扩展。 - Jeremy W. Sherman用法: NSLog("%@", NSStringFromSelector(_cmd));
_cmd
是一个特殊的变量,传递给每个方法,就像self
一样,它是对调用方法的选择器的引用(基本上是方法的名称和签名)。
我经常使用以下宏:
#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
如果您一直想要函数名称,您可以根据需要轻松地进行调整。
这是您想要的内容:
NSLog(@"%s", __PRETTY_FUNCTION__);
如果您想获取更多有关日志记录相关信息,请阅读以下问题的答案:如何打印方法名称和行号,并有条件地禁用NSLog?
__func__
在所有当前的 Mac OS X 编译器中都执行相同的操作,并且在 C99 中保证存在。此外,请不要使用 %@
,因为 __PRETTY_FUNCTION__
和 __func__
都是 C 字符串,而不是 NSString 对象。 - Peter Hosey__func__
返回的东西和__PRETTY_FUNCTION__
一样吗?我以为__PRETTY_FUNCTION__
对于C函数会提供更多信息,比如参数名之类的? - Nick Forge-[MyClass selector]
)和C函数(nameoffunc
)中,两个标识符在GCC 4.2.1和Clang中具有相同的值。我没有测试C++,因为我不懂C++。 - Peter Hosey__func__
只返回C++成员函数和静态成员函数的基本名称。__PRETTY_FUNCTION__
返回整个字符串——编码为连字符名称的所有信息。void* A::B::C::DoIt(int, int)
返回 __func__ = __FUNCTION__ = DoIt
但是 __PRETTY_FUNCTION__ = void* A::B::C::DoIt(int, int)
。 - Jeremy W. Sherman