如何将当前方法的名称或签名转换为NSString?

43 iphone cocoa cocoa-touch objective-c uikit

示例:我有一个方法-myFooBarMethod:withFoo:bar:moreFoo:,在该方法的实现中,我想动态获取它的名称,就像@"-myFooBarMethod:withFoo:bar:moreFoo:进入NSString一样.没有硬签名的方法签名.

我觉得这必须与选择器做点什么.我怎么能得到当前方法的名称(执行代码的方法)作为NSString?

Mar*_*don 95

每个方法调用还传递两个隐藏的参数:id命名selfSEL命名_cmd.您可以使用NSStringFromSelector将方法选择器转换为NSString:

NSStringFromSelector(_cmd);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用**`__PRETTY_FUNCTION__`**宏,预处理器替换为方法名称的C字符串(char*).它也适用于C函数. (12认同)
  • 我不知道有一个名为`__PRETTY_FUNCTION__`的宏.我喜欢它.现在我只需找到一个在我的代码中使用它的理由...... (2认同)

Pet*_*sey 17

使用__func__.这是一个C字符串,因此对于NSString,请使用[NSString stringWithUTF8String:__func__].

这有两个优点_cmd:

  1. 它适用于C函数和C++方法以及Objective-C方法.(事实上​​,__func__C99必须存在.)
  2. 在Objective-C方法中,它包括方法类型(类方法与实例方法)以及类名和选择器.例如,"-[MyView drawRect:]".


Abi*_*ern 7

作为这种事情有用的例子:这是我使用的NSLog消息的模板:

NSLog(@"%@ %@: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), @"A Message");
Run Code Online (Sandbox Code Playgroud)

这会在记录时将类和方法转储到控制台.