2012-11-21 98 views
7

在ARC之前,我有一個「X可能不會響應xxx」警告,這是一個非常無害的警告,並不妨礙它編譯。現在,我試圖將我的項目轉換爲ARC,並且我有一個「沒有可見的@interface for X聲明選擇器xxx」錯誤,這阻止了它的編譯。如何忽略「X沒有可見的@interface聲明選擇器」?

我完全知道我在做什麼,爲什麼警告在那裏,我可以告訴你程序是正確的。以前,編譯器沒有問題編譯它,現在不應該停止編譯。

這是事實,X類的接口不聲明選擇,但X是動態地處理任何消息,任何的選擇發送給它的類,使用forwardInvocation:(即約Objective-C的美麗的事情之一),所以它的接口不可能聲明所有可以在其上調用的選擇器。並且選擇某處聲明,只是沒有上十

+0

該文件說:「爲了給您的對象並不認爲它自己的方法作出迴應,你必須重寫methodSignatureForSelector:「你做到了嗎? – rdelmar

+0

也許這個答案可以幫助你。 http://rckoverflow.com/a/8002646/1341136 – hanjae

+0

@rdelmar:不,這是一個編譯時錯誤。與運行時工作方式無關(工作正常) – user102008

回答

5

我知道我在做什麼,爲什麼警告在那裏,我可以告訴你該程序是正確的。

好的 - 只需使用objc_msgSend et al。直接如果你想編譯器的工作。

這是事實,X類的接口不聲明選擇,但X是動態地處理與發送給它的任何選擇的任何消息,使用forwardInvocation類:(即約Objective-美麗的事情之一C),所以它的接口不可能聲明所有可以在其上調用的選擇器。並且選擇在某處聲明,只是沒有上十

如果它太繁瑣的申報,但沒有足夠的消息,似乎違背了你的程序使用選擇的使用繁瑣......聽起來像產生的危險地帶代碼具有重要的人爲干預。

也許你應該考慮聲明一個協議,以便編譯器至少可以爲你正確設置消息調用 - 而且如果你改變或破壞了某些東西,它有機會適應或通知你。

2

我不確定,但我相信在ARC下編譯器可以看到方法簽名更重要,因爲它需要知道需要什麼內存管理。所以,你要麼需要:

  1. 通過正常方法之一聲明你正在使用的方法(即理想的實際接收器,但如果沒有別的作爲一個類別,即使只在NSObject)。
  2. 通過NSInvocation或其他一些類似的方式手動執行操作,對內存管理負責(這可能會非常棘手,因爲您必須通過ARC橋接)。

更新:我只是檢查鐺源,這確實是這樣的 - 它使用ARC時需要簽名。這不僅僅是在表達自己的意思。:)

1

這是事實,X類的接口不聲明選擇,但X是動態地處理與發送給它的任何選擇的任何消息,使用forwardInvocation類:(這是關於美麗的事情之一Objective-C),所以它的接口不可能聲明所有可以在其上調用的選擇器。並且選擇器被聲明在某處,而不是X.

如果要放棄靜態類型信息,則轉換爲標識。或者,如果你的對象是另一個類的代理,那麼可能會投到該類。

只要方法是在頭文件中聲明的某處(無論如何都需要這樣做),並且參數類型不存在歧義,這應該修復錯誤。

如果你有興趣,爲什麼這僅是一個問題與ARC啓用,檢查回答這個問題,我問:Why is 'no known method for selector x' a hard error under ARC?

+0

這並非總是可行。例如,如果這是「super」的消息,則不可能「轉換爲id」。 – user102008

相關問題