2011-08-03 45 views
3

下面的代碼是完全安全的,但Xcode的4讓我爲它的錯誤:Xcode 4/LLVM 3.0 - 讓它對於「沒有已知的選擇器實例方法」錯誤更聰明一點?

if ([self respondsToSelector: @selector(foo)]) 
     [self foo]; 

我知道,我可以得到它周圍有一個虛擬的協議,但我用這種模式很頻繁,它感覺這樣的工作量不應該是必要的。有沒有辦法在某個地方設置一個設置,最好是一次,以便這個「錯誤」不會再次影響我?

+0

除了一個協議(如你所說),另一種解決方法是聲明一個公共方法。 –

回答

0

下列那種模式的沉默時,編譯器,我使用-performSelector:

if ([self respondsToSelector:@selector(foo)]) { 
    [self performSelector:@selector(foo)]; 
} 

我不知道任何其他方式。

+0

呃,如果我真的想做的事情可能會有問題[self fooWithInteger:2]; 。 。 。或者更糟糕的是[self fooWithX:1 y:2 z:3]; –

+0

@威廉:確實。出於這個原因,我避免了類似的方法簽名。我發現我需要有條件地發送基於響應性的消息的情況很少,所以它沒有足夠讓我探索其他選項。只是我的兩分錢。 –

+0

@WilliamJockusch:你可以使用NSInvocation來做到這一點。 –

4
if ([self respondsToSelector: @selector(foo)]) 
    [self foo]; 

表達是只有「絕對安全」,如果有沒有參數和返回值。如果需要任何類型的信息,@selector(foo)是不夠的。

即便如此,我懷疑有些體系結構的ABI是這樣的,即無參數無返回的情況實際上要求編譯器可以使用類型知識來生成絕對保證正確的代碼。

也就是說,你的fooWithInteger:和/或fooWithX:y:z:例子可以不可能正確,而不可用由於C語言和特定結構ABI變幻莫測的全部類型的信息編制。

爲好,讓編譯器來編譯,沒有警告就需要編譯器串通運行時表達式 - respondsToSelector:必須被動態調度 - 與編譯時表達式。編譯器討厭這個。

相關問題