2010-04-22 48 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 

如果你總是想要的功能名稱,你可以很容易地適應他們的要求。

相關問題