2011-06-16 54 views
0

迴應此問題發表評論:Is it possible to suppress Xcode 4 static analyzer warnings?,這是一個誤報(或至少我相信是這樣)。誤報Xcode4分析儀

下面的代碼提供了以下信息:

雖然存儲爲「動作」的值在封閉表達被使用,該值永遠不會實際從「動作」讀

NSArray *actions = [button actionsForTarget:target forControlEvent:controlEvent]; 
if (actions) 
{ 
    NSEnumerator *actionEnumerator = [actions objectEnumerator]; 
    NSString *action; 
    while ((action = (NSString *)[actionEnumerator nextObject])) 
    { 
     [button removeTarget:target action:@selector(action) forControlEvents:controlEvent]; 
    } 
} 
+0

這是有趣的 - 你應該提交錯誤報告給蘋果 – Nektarios 2011-06-16 16:48:20

回答

1

靜態分析器是正確的,你不使用/閱讀它的動作! @selector()不接受NSString,因此它總是返回一個名爲action的方法的選擇器。 Plus:@selector()是一個編譯時函數,編譯器將用一個靜態值替換它。非常像sizeof()與數據結構的大小。

您應該使用NSSelectorFromString()從NSString中獲取選擇器。

3

那是因爲當你做@selector(action)時,它是對一個名爲「action」的選擇器的引用。換句話說,@selector的參數被解析爲一個文字,而不是一個變量。

由於action變量是指一個NSString命名一個選擇,你想要的可能是:

[button removeTarget:target action:NSSelectorFromString(action) forControlEvents:controlEvent]; 

事實上,你甚至不需要通過動作進行迭代。一個更好的辦法來做到這一點是這樣的一行代碼:

[button removeTarget:target action:NULL forControlEvents:controlEvent]; 
+0

你是正確的,併爲擡頭的感謝。除了睡着之外,我應該仔細閱讀手冊。 – jonoogle 2011-06-16 21:09:58

2

這不是一個假陽性,這是一個真正的()錯誤。

@selector(action)描述了名稱爲action的方法。它確實是而不是描述了一個名稱存儲在變量action中的方法!

靜態分析只是救了你... ;-)

+0

你說得對,我可能寫過半睡半天。謝謝。 – jonoogle 2011-06-16 21:06:23

+0

我不得不承認,我花了很長時間才弄清楚。教訓是相信99%的工具。 :-) – Eiko 2011-06-16 21:22:02

+0

正是!我曾經是工具製造者(並且在工具中犯了一些錯誤;)。這個錯誤是愚蠢的(在我的方面),但其中的一個,你看了它100次(並且我在發佈之前多次研究了代碼行),它看起來是正確的,但它是錯誤的:(我重新檢查了我的代碼並退出279 @選舉人,這是唯一錯誤的選擇。 – jonoogle 2011-06-17 09:53:28