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の例のようにゲッターアクセサにメッセージを送信するだけではありませんか?
このような 'isKindOfClass:'ベースの動作スイッチは一般的に最適ではないアーキテクチャを示しています。 Objective-Cはダイナミズムと多型をサポートしていますが、一般的には流行しません。 – bbum
'obj'は' id'型であるため、 'obj.myProp3'はコンパイルに失敗します。ドットシンタックスは、レシーバが明示的な型であることを要求します(具体的には、 'id'レシーバの脆弱性をドット構文に永続させないため)。 – bbum
@ bbum-ありがとう!それは意味をなさない(あなたのコメントの両方)。 RTTIのようなチェックの理由は、いくつかのスタイルのView Controllerを扱う1つのUIPopoverControllerがあるからです。私はそれらを再利用することが良いことを読んだので、私のハンドラ(POCが却下されたとき)は何をすべきかを知るために何らかのチェックをしなければならない。 – dreyln