1

私はObjectiveCをより深く理解しようとしています。

警告を回避するために、通話の前にキャストする必要があるのはなぜですか?これはコンパイラにとって簡単なことではありませんか?私が見逃している動的な側面はありますか?

if ([a.class conformsToProtocol:@protocol(P1)])
{
  [(id<P1>)a p1Message];
}

つまり、C / C ++の観点からは理解できますが、結局のところ、Objective Cコンパイラを使用しており、キャストは好きではありません。:)

4

1 に答える 1

1

aがコンパイル時に実装として自分自身を宣言する特定の型である場合は、P1キャストする必要はありません。

aが型の場合id、戻り型があいまいで実際に使用している場合、またはパラメータが含まれている場合にのみキャストする必要があります。これは通常、メソッド名に複数のメソッドシグネチャがあるp1Messageため、コンパイラがどちらを期待するかわからないことを意味します。

aが自分自身を実装として宣言しないタイプの場合P1、個別に(そして繰り返し)宣言しない限りp1Message、オブジェクトが実装しない可能性のあるメソッドを呼び出しているため、警告が表示されます。

私が推測しなければならない場合、おそらく(たとえば、デリゲートにとってはより一般的です)ではなくaタイプであると宣言されており、複数のが飛び回っています。また、ある日、同じ名前の複数の異なるメッセージがあり、実装する可能性のある他の誰かが、誰かがそのメソッド名を使用するプロジェクト内の他のすべての場所を知る必要がないため、キャストを積極的に配置することもできます。idid <P1>p1Messagep1Message

コンパイラーは、動的ランタイムであるため、正確conformsToProtocol:に呼び出すことが安全であるというチェックから誘導することはできません。コンパイル時または実行時にp1Message別の実装に置き換えた可能性があります。つまり、コンパイラがその機能を認識していると想定するのは安全ではありません。conformsToProtocol:その呼び出しは、他の呼び出しと同じように動的にディスパッチされます。

于 2012-09-26T19:29:36.750 に答える