2012-12-01 122 views
0

我有一個特殊的NSLog方法swizzle,它將當前方法作爲日誌語句的一部分進行打印。解決方法:使用未聲明的標識符'_cmd'

對於目標C的方法,我有一個使用一個宏:NSStringFromSelector(_cmd)

對於非目標C的方法,我有一個使用__PRETTY_FUNCTION__因爲_cmd並不限定的第二宏。

我現在想用兩個相同的宏,所以我想測試,如果它被定義,我想我能做到這一點是這樣的:

NSString *command = (&_cmd != nil ? NSStringFromSelector(_cmd) : [NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding]) 

,但我仍然得到一些Use of undeclared identifier '_cmd'錯誤當宏在非Objective-C方法中使用時。如何確定_cmd是否已定義,如何進行運行時測試?

回答

0

您無法在運行時測試_cmd是否已定義。在Objective-C方法中定義了__PRETTY_FUNCTION__宏。隨處使用__PRETTY_FUNCTION__,並且不要嘗試使用_cmd

例子:

- (IBAction)mapWasTapped:(UITapGestureRecognizer *)sender { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
} 

下面是輸出:

2012-12-01 11:45:30.036 TestApp[92581:c07] -[MainViewController mapWasTapped:] 
+0

的問題是,我要找的只是方法的名稱,而不是類名。我可以嘗試一些解析,但不能確定__PRETTY_FUNCTION__會返回每次看起來相同的東西 – coneybeare

+0

如果'__PRETTY_FUNCTION__'以'-'或'+'開頭,則將所有內容剝離到一個空格處並剝離尾部' ]'。 –

+0

我最終使用NSScanner來抓取「[」,然後是「」和「]」之後的所有內容,因爲從塊調用的方法在「]」之後有一個__block_invoke_0, – coneybeare