1

Objective-C では、どちらがより良いコーディング方法ですか?

// バージョン #1

id obj<MyProtocol>;
[obj myMessage];

// バージョン #2

   id obj;
   if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
       [obj myMessage];

何らかの理由でサンプル コードにバージョン 1 が表示されますが、私にはバージョン 2 の方が安全に思えます。実行時にプロトコル MyProtocol に準拠しない汎用 ID から obj が割り当てられた場合はどうなりますか?

4

3 に答える 3

9

1 つ目は、コンパイル時のチェックです。

2 つ目は実行時チェックです。

「両方を行う」というIsaacの答えは確かに実行可能ですが、プロトコル適合性チェックには、特定の場所で特定の時間に大きなオーバーヘッドがありました(警告;時期尚早の最適化など)。同様に、プロトコルは @optional メソッドをサポートしています。

コンパイル時のプロトコル チェック (つまり、宣言、正確、インターフェイス、および使用)respondsToSelector:を実行時に使用することをお勧めします。コードがリファクタリングされ、非常に高速であるため、移行が容易になり@optionalます。@requiredrespondsToSelector:

于 2013-03-11T23:22:10.320 に答える
1

Objective-C は実行時にバインドされ、型保存ではないため、両方を実行します。適切な宣言により、コンパイル時に検出されるすべてのエラーが防止されます。正当な理由により、それらのほとんどは単なる警告です。実行時チェックにより、対処する必要のある参照が得られない場合にアプリがクラッシュするのを防ぎます。

于 2013-03-11T23:39:22.187 に答える
1

両方を行います:

id<MyProtocol> obj;
if( [[obj class] conformsToProtocol:@protocol(MyProtocol)] )
{
    [obj myMessage];
}

最初の変数の型は、変数で何をしようとしているのかをコンパイラに伝えますが、変数が実際に必要なものを保持することを保証するものではありません。2 番目の適合性チェックでは、変数が実際に必要なものを保持しているかどうかをテストします。

于 2013-03-11T23:22:09.273 に答える