2012-11-21 9 views
7

ARCの前に、「Xはxxxに応答しない可能性があります」警告があります。これはコンパイルを妨げない非常に害のない警告です。今、私のプロジェクトをARCに変換しようとしていますが、「Xのための表示されない@interfaceでセレクタxxxが宣言されています」エラーがコンパイルできません。無視する方法 "Xの表示されない@interfaceはセレクタを宣言しません"?

私は何をやっているのか、なぜ警告があったのか、私は知っています。プログラムが正しいことを教えてください。これまでコンパイラは問題なくコンパイルしていましたので、コンパイルを中止するべきではありません。

クラスXのインターフェイスは、そのセレクターを宣言していないことは事実であるが、XはforwardInvocation:を(つまり、Objective-Cの程度美しいものの一つである使用して、動的に任意のセレクタと任意のメッセージは、それに送られ処理するクラスです)ので、そのインタフェースは、呼び出すことができるすべてのセレクタを宣言することはできません。そして、セレクタだけではないX.

+0

をドキュメントは言う:「あなたのオブジェクトは、それ自体が認識されない方法に対応するため、 methodSignatureForSelectorをオーバーライドする必要があります。 – rdelmar

+0

多分、この答えはあなたを助けるかもしれません。 http://stackoverflow.com/a/8002646/1341136 – hanjae

+0

@rdelmar:いいえ、これはコンパイル時エラーです。 – user102008

答えて

5

私は私がやって正確に知るには、どこかで宣言され、警告があった理由は、私はプログラムが正しいことを伝えることができます。

OK - ちょうどobjc_msgSendなどを使用してください。あなたがコンパイラの仕事をしたいのであれば直接。

クラスXのインターフェイスでセレクタが宣言されていないが、XはforwardInvocationを使用して送信された任意のセレクタを持つメッセージを動的に処理するクラスです(Objective- C)ので、そのインタフェースは、呼び出すことができるすべてのセレクタを宣言することはできません。そして、セレクタは、どこかで宣言されているだけではないX.

それが宣言するにはあまりにも面倒ですが、十分なセレクタのあなたのプログラムの使用を矛盾するようメッセージングで使用するために退屈ではない...生成の危険な領域のような音した場合に重要な人間の介入を伴うコード。

おそらく、コンパイラがメッセージの呼び出しを正しく設定できるように、プロトコルを宣言することを検討する必要があります。何かを変更したり壊したりすると、それに適応するか通知する機会があります。

2

私は確信していませんが、ARCの下では、どのメモリ管理が必要かを知る必要があるため、コンパイラがメソッドシグネチャを参照することが重要です。だから、どちらかする必要があります

  1. (実際の受信機に、すなわち理想的には、それでものみNSObjectの場合、カテゴリなど何もない場合)は、通常の方法のいずれかを経由して、使用しているメソッドを宣言します。
  2. NSInvocationまたはその他の同様の方法で手動で処理します(メモリ管理の全責任を負います(ARCとブリッジする必要があります)。

更新:私はちょうど打ち鳴らすソースを確認し、これは確かにそうである - それARCを使用している場合署名を必要と。それは単に意味することではありません。:)

1

クラスXのインターフェイスはそのセレクタを宣言していませんが、XはforwardInvocationを使用して送信されたセレクタを持つメッセージを動的に処理するクラスです(これは、 Objective-C)、そのインタフェースは、呼び出すことができるすべてのセレクタを宣言することはできません。セレクタはXで宣言されていません。

静的型情報を破棄する場合はidにキャストしてください。または、あなたのオブジェクトが別のクラスのプロキシであれば、そのクラスにキャストすることもできます。

メソッドがヘッダーのどこかで宣言されている(とにかく必要な)メソッドで、引数型のあいまいさがない限り、これはエラーを修正するはずです。

あなたはこれが唯一のARCの問題が有効になっている理由に興味があれば、この質問への答えをチェックし、私は尋ねた:Why is 'no known method for selector x' a hard error under ARC?

+0

これは必ずしも可能ではありません。例えば、これが 'super'へのメッセージであれば、' 'idにキャストする ''ことはできません。 – user102008

関連する問題