2

次のようなコードがたくさんあります。

id myObjectRaw = getObject();
if(![myObjectRaw isKindOfClass:[MyClass class]]) return nil;
MyClass * myObject = myObjectRaw;
...

ここでid getObject()は、いくつかの種類のオブジェクトを返すことができます。ただし、上記のコードは私には不格好に感じます。これを書いても安全ですか?

MyClass * myObject = getObject();
if(![myObject isKindOfClass:[MyClass class]]) return nil;
...

コンパイラは文句を言いませんが、 にgetObject関連しないオブジェクトを返す場合、未定義の動作を踏んでいないかどうかわかりませんMyClass

(いいえ、返されるすべてのクラスを実際に制御できないため、スーパークラスまたはインターフェイスを使用することはできません。)

4

4 に答える 4

0

使用するid myObjectRaw場合、オブジェクトの種類を定義してmyObjectRawいないため、コンパイラはMyClass * myObject = getObject();有効な操作であるかどうかを知りません。コンパイラは、あなたが何をしているかを知っていることを前提としています。getObject()異なるオブジェクトを返す場合、MyClassまたはそのサブクラスではない場合、アプリがクラッシュする可能性があります。これは実行時エラーです。

異なるオブジェクトを返す場合getObject()、返すことができるオブジェクトの種類のオブジェクトを少なくとも 1 つ期待する必要があります。異なるオブジェクトを処理する必要がある場合は、次のような if-else-if 命令をいつでも使用できます。

id myObjectRaw = getObject();

if([myObjectRaw isKindOfClass:[MyClass1 class]])
{
    MyClass1 objectClass1 = myObjectRaw;
}
else if([myObjectRaw isKindOfClass[MyClass2 class]])
{
    MyClass2 objectClass2 = myObjectRaw;
}

ただし、返されるオブジェクトがオブジェクトで、このクラスが最初の条件MyClass2のサブクラスである場合は true になります。MyClass1したがって、オブジェクトはオブジェクトとして保存されMyClass1ます。その場合は、優先順位を確立し、それに応じてネストされた if-else-if ステートメントに配置する必要があります。

于 2013-09-12T06:20:16.083 に答える