2

myObject2からmyObject1に関連付けられたmyMethodを呼び出すと、「myObject1が-myMethodに応答しない可能性があります」という警告が表示されることがよくありますが、プログラムは問題なく実行されます。コンパイラがコンパイル時に宣言されたメソッドを認識しないのはなぜですか?

ジョン・ドナー

4

5 に答える 5

2

Objective-C は非常に動的な言語であるため、これは警告として表示されます。コンパイル時に、ファイルをコンパイルしようとしたとき、コンパイラは "myMethod" の宣言を見つけられませんでした (ヘッダー ファイルが見つからないか、ヘッダーに含めるのを忘れている可能性があります)。ただし、Objective-C には実行時に追加のメソッドを作成して読み込む機能があり、コードが実行されるまでにそのメソッドが存在するため、警告のみが生成されました。したがって、これは単なる警告です。

ほとんどの場合、適切なヘッダー ファイルでメソッドを宣言していません。

于 2009-12-12T04:39:33.667 に答える
1

この警告は、コンパイラがまだメソッド宣言を認識していないメソッドを呼び出していることを意味します。これは他のほとんどの言語ではエラーであり、無視できない警告であることは間違いありません。

メソッドを宣言していない場合は、ソース ファイルの先頭にある @interface ブロック (プライベート メソッドの場合) またはクラスのヘッダー ファイル (パブリック メソッドの場合) で宣言します。

ヘッダー ファイルでメソッドを宣言した場合は、必ずヘッダー ファイルをインポートしてください。

メソッドを宣言し、正しいヘッダー ファイルをインポートしている場合は、どこかにタイプミスがあります。

于 2009-12-12T05:56:54.327 に答える
0

または、デリゲート クラスを使用している場合は、コンパイラがデリゲート メソッドを見つけられるように、それらのデリゲート メソッドを含むカテゴリを定義する必要があります。

于 2009-12-12T05:41:36.717 に答える
0

これが頻繁に発生するケースの 1 つは、オブジェクトを含む変数の型がスーパークラスの型であり、メソッドがサブクラスに対してのみ定義されている場合です。idこれは、次のように入力するか、静的型付けをより具体的にすることで回避できます。変数の型がクラス自体の型である場合、メソッドを呼び出そうとしているスコープ内のコンパイラからメソッドが見えない可能性があります — 他の回答はこの状況に対処します。

于 2009-12-13T05:54:34.937 に答える
-2

通常、追加

@class myObject1

問題を解決します。StackOverflowでObjective-C@classvs.#importに対するBenGottliebの回答を確認してください。

于 2009-12-12T09:02:16.250 に答える