询问一个方法的名称有什么方法吗?

14

我正在尝试调试一个iPhone应用程序,但是在各个源文件中添加五十个NSLog语句的想法让我感到不安。

我想做的是编写一对语句,例如

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

我希望能够将一段代码复制粘贴到需要的每个方法中。有没有一种方法可以做到这一点?是否有一种Objective-C结构可以询问方法的名称?还是我必须走弯路?


这是一个完全重复的问题,与https://dev59.com/NHE85IYBdhLWcg3wnU-p#2687873相同,该问题有一个更完整的答案。 - Ken
@Ken 我知道有点晚了,但我认为你的链接不正确。它应该指向https://dev59.com/sXNA5IYBdhLWcg3wa9Kp?lq=1 - Can Poyrazoğlu
4个回答

23

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

这也适用于函数。这是一个编译器特性。


2
__func__是C99语言的一个特性。它的近亲__FUNCTION____PRETTY_FUNCTION__是由GCC和可能其他编译器提供的语言扩展。我相信这三个都是C++语言的扩展。 - Jeremy W. Sherman
有没有一种方法可以询问一个方法的名称? - Ken

12

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

_cmd 是一个特殊的变量,传递给每个方法,就像self 一样,它是对调用方法的选择器的引用(基本上是方法的名称和签名)。


1
NSLog(“%s”,_cmd); 一个SEL是一个C字符串。 - drawnonward
6
是的,从技术上讲是可以这样做,但最好还是使用正确的转换函数。 - Dave DeLong
9
它被实现为一个类型,但被定义为一个不透明类型。苹果因为会在你不知情的情况下更改这种东西而臭名昭著,所以按照文档使用它,而不管它的实际实现方式如何。 - Jason Coco

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

如果您一直想要函数名称,您可以根据需要轻松地进行调整。


2

1
__func__ 在所有当前的 Mac OS X 编译器中都执行相同的操作,并且在 C99 中保证存在。此外,请不要使用 %@,因为 __PRETTY_FUNCTION____func__ 都是 C 字符串,而不是 NSString 对象。 - Peter Hosey
感谢指出%@错误(我已经修复了这个错误)。对于Obj-C方法、C函数和C++函数,__func__返回的东西和__PRETTY_FUNCTION__一样吗?我以为__PRETTY_FUNCTION__对于C函数会提供更多信息,比如参数名之类的? - Nick Forge
在Objective-C方法(-[MyClass selector])和C函数(nameoffunc)中,两个标识符在GCC 4.2.1和Clang中具有相同的值。我没有测试C++,因为我不懂C++。 - Peter Hosey
1
对于C++,__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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接