2011-06-28 3 views
3

I汎用ID変数にオブジェクトを代入した後、オブジェクトが属する前記のクラスに応じて様々なことを行い、いくつかのコードは、(各クラスが適切なプロパティが定義され、正しく実装していると仮定)を有する:idポインタを使用すると、[obj propName]または[obj valueForKey:@ "propName"]の方が良いですか?

id obj = #<this could be one of several things># 
id result; 
if ([obj class] == [MyClass1 class]) 
{ 
    result = [obj myProp1]; 
} 
else if ([obj class] == [MyClass2 class]) 
{ 
    result = [obj valueForKey:@"myProp2"]; 
} 
else if ([obj class] == [MyClass3 class]) 
{ 
    result = obj.myProp3; // this doesn't compile! 
} 
else 
{ 
    result = nil; 
} 

MyClass1とMyClass2のスニペットに関しては、動的ではないケース(プロパティの名前は一定です)で直接メッセージをオブジェクトに送信するよりも、KVCをより適切またはより優れていると見なしていますか? KVCテクニックの使用にはより多くのオーバーヘッドが必要なので、呼び出されるプロパティの名前が動的な場合にのみ使用する必要がありますか?私はKVCを使用することをお勧めします。

MyClass3-でスニペットについては、なぜドットシンタックスを使用するとコンパイルエラーが発生しますか?これは、基本的には、MyClass1の例のようにゲッターアクセサにメッセージを送信するだけではありませんか?

+0

このような 'isKindOfClass:'ベースの動作スイッチは一般的に最適ではないアーキテクチャを示しています。 Objective-Cはダイナミズムと多型をサポートしていますが、一般的には流行しません。 – bbum

+2

'obj'は' id'型であるため、 'obj.myProp3'はコンパイルに失敗します。ドットシンタックスは、レシーバが明示的な型であることを要求します(具体的には、 'id'レシーバの脆弱性をドット構文に永続させないため)。 – bbum

+0

@ bbum-ありがとう!それは意味をなさない(あなたのコメントの両方)。 RTTIのようなチェックの理由は、いくつかのスタイルのView Controllerを扱う1つのUIPopoverControllerがあるからです。私はそれらを再利用することが良いことを読んだので、私のハンドラ(POCが却下されたとき)は何をすべきかを知るために何らかのチェックをしなければならない。 – dreyln

答えて

3

いいえ、KVCは適切ではないと考えられます。これを行う理想的な方法は、それが何であるかを知ったら、オブジェクトをクラス型にキャストすることです。あなたはまた、間違ったクラスをテストしています。代わりに-isKindOfClass:を使用する必要があります。クラステストは、-isMemberOfClass:とほぼ同じです。

id obj = getObj(); 
id result = nil; 
if ([obj isKindOfClass:[MyClass1 class]]) { 
    result = [(MyClass1 *)obj myProp1]; 
} else if ([obj isKindOfClass:[MyClass2 class]]) { 
    result = [(MyClass2 *)obj myProp2]; 
} else if ([obj isKindOfClass:[MyClass3 class]]) { 
    result = ((MyClass3 *)obj).myProp3; 
} 
+0

これは奇妙なことです。キャストアウト(つまり[obj myProp1])を使用してメッセージを送信するときにコンパイルエラーや警告を受け取ることはありませんが、意図的にプロパティ名のスペルを間違えてしまうと警告が表示されます。何がありますか? – dreyln

+2

コンパイラが 'id'を見ると、* any *クラスの*宣言されたメソッドは、「このメソッドは存在しますか」という契約を満たします。 – bbum

+0

isKindOfClassに関するアドバイスありがとう – dreyln

関連する問題