我試圖調試我正在工作的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++語言的擴展。 – 2010-04-23 01:37:52
http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873 – Ken 2010-05-05 03:24:33
用途:NSLog("%@", NSStringFromSelector(_cmd));
_cmd
是傳遞給就像self
每一個方法,它是導致要調用的方法選擇(基本方法的名稱和簽名)的參考的特殊變量。
'NSLog (「%s」,_cmd);' SEL是一個C字符串。 – drawnonward 2010-04-22 03:41:53
@drawnonward是的,從技術上講是,但使用正確的轉換函數仍然很好。 – 2010-04-22 04:07:55
@drawnonward:它被實現爲一個,是的,但它被定義爲不透明類型。蘋果公司是臭名昭着的交換這樣的東西從你下面,所以使用它作爲記錄,無論它如何實際執行。 – 2010-04-22 04:24:14
這是你想要什麼:
NSLog(@"%s", __PRETTY_FUNCTION__);
有關相關記錄的東西更多信息,請閱讀過這個問題的答案:How to print out the method name and line number and conditionally disable NSLog?
'__func__'做同樣的事情(在目前所有的Mac OS X編譯器),並保證由C99存在。另外,不要使用'%@',因爲'__PRETTY_FUNCTION__'和'__func__'都是C字符串,而不是NSString對象。 – 2010-04-22 05:14:20
感謝您指出%@錯誤(我已經修復了錯誤)。對於Obj-C方法,C函數和C++函數,'__func__'是否返回與__PRETTY_FUNCTION__相同的東西?我認爲'__PRETTY_FUNCTION__'爲C函數提供了更多信息,比如參數名稱或其他? – 2010-04-22 05:30:46
在GCC 4.2.1和Clang中,兩個標識符在Objective-C方法(' - [MyClass selector]')和C函數('nameoffunc')中具有相同的值。我沒有測試C++,因爲我不知道C++ .. – 2010-04-22 19:50:44
我用下面的宏頻繁:
#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
如果你總是想要的功能名稱,你可以很容易地適應他們的要求。
這是一個確切的dup http://stackoverflow.com/questions/2687785/any-way-to-ask-a-method-for-its-name/2687873#2687873它有一個更完整的答案。 – Ken 2010-05-05 03:20:12
@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