9

ARC の前に、「X may not response to xxx」という警告が表示されました。これは、コンパイルを妨げない無害な警告です。現在、プロジェクトを ARC に変換しようとしていますが、「No visible @interface for X はセレクター xxx を宣言しています」というエラーが発生し、コンパイルできません。

私は自分が何をしているのか、なぜ警告が表示されたのかを正確に知っています。プログラムは正しいと言えます。以前は、コンパイラは問題なくコンパイルしており、コンパイルを停止する必要はありません。

クラス X のインターフェイスがそのセレクターを宣言していないことは事実ですが、X は、(Objective-C の優れた点の 1 つです)を使用して、送信されたセレクターを持つメッセージを動的に処理するforwardInvocation:クラスであるため、そのインターフェイスはおそらく不可能です。その上で呼び出すことができるすべてのセレクターを宣言します。そして、セレクター、X ではなく、どこかで宣言されています。

4

3 に答える 3

5

私は自分が何をしているのか、なぜ警告が表示されたのかを正確に知っています。プログラムは正しいと言えます。

OK -- objc_msgSendet al. を使用してください。コンパイラの作業を行いたい場合は直接。

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

宣言するのは面倒だが、プログラムのセレクターの使用と矛盾するように見えるメッセージングで使用するほど退屈ではない場合... 重大な人間の介入を伴う生成コードの危険な領域のように思えます。

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

于 2012-11-21T03:42:35.227 に答える
2

確かではありませんが、ARC の下では、必要なメモリ管理を知る必要があるため、コンパイラがメソッド シグネチャを確認できることがより重要であると考えています。したがって、次のいずれかを行う必要があります。

  1. 通常のメソッドのいずれかを使用して、使用しているメソッドを宣言します (つまり、理想的には実際のレシーバーで、ただし、カテゴリとして他に何もない場合でも、 on のみであってもNSObject)。
  2. 手動で、NSInvocationまたは他の同様の手段を使用して、メモリ管理の全責任を負います (これは、ARC との間でブリッジする必要があるため、注意が必要な場合があります)。

更新:clang ソースを確認したところ、これは実際に当てはまります。ARCを使用する場合は署名が必要です。意地悪をしようとしているだけではありません。:)

于 2012-11-21T03:54:53.763 に答える
1

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

静的な型情報を破棄したい場合は、id にキャストします。または、オブジェクトが別のクラスのプロキシである場合は、おそらくそのクラスにキャストします。

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

これが ARC を有効にした場合のみの問題である理由に興味がある場合は、私が尋ねたこの質問への回答を確認してください: Why is 'no known method for selector x' a hard error under ARC?

于 2013-05-21T23:32:42.837 に答える