3

Objective-C のゲームを書いていますが、ゲーム ループ内のコードの最適化を開始する段階に来ています。
私は大量のクラス比較メソッドを使用していますが、

if ([obj isMemberOfClass:[SomeClass クラス]])

この種のチェックは非常にコストが
かかると聞きました。1 つの配列に複数のクラスを設定することだけを選択したため、ある種のクラス チェックが必要です。
おそらく、NSObject をサブクラス化する NSObject にプロパティを追加して、文字列プロパティを含めることを考えていました。初期化中に、その特定のサブクラスのクラス名と等しくなるようにします。次に、単に

if ([obj.klass isEqualTo:@"SomeClass"])

これは有益でしょうか?
ゲームループからできるだけ多くの動的コーディングを排除しようとしています。

ありがとう!

4

2 に答える 2

2

これはあなたの質問に対する直接的な回答ではありませんが、より広い意味での回答です。

Objective-C の哲学は、メッセージを送信し、それをどう処理するかをオブジェクトに決定させるという Smalltalk の哲学に似ています。オブジェクトがどのクラスであるかを確認するために多くのテストを行う必要がある場合は、設計を再考する必要があります。

たとえば、オブジェクトの配列があり、それぞれを整数に変換して計算を行いたい場合は、次のようにすることができます。

for (id anObj in array)
{
    int anInt = [anObj intValue];
    // do something with anInt
}

それぞれのクラスが何であるかは関係ありません。anObj送信できます-intValue。たとえば、配列が と でいっぱいであるNSStrings場合NSNumbers、それは問題ではありません。上記のコードは、期待どおりに動作します。

多くのクラスは、セレクターのメソッドを定義していません-intValue。たとえば、そのメッセージをそのインスタンスに送信するとNSData、例外がスローされて応答します。状況に応じて、これを解決する方法がいくつかあります。

  1. オブジェクトがセレクターを認識しているかどうかをテストして、セレクターに応答しないオブジェクトを無視する

    for (id anObj in array)
    {
        if ([anObject respondsToSelector: @selector(intValue)])
        {
            int anInt = [anObj intValue];
            // do something with anInt
        }
    }  
    
  2. 配列に配置されることがわかっているすべてのクラスのセレクターを定義します。これは、カテゴリを宣言することによって行われます。このようにして、サブクラス化せずに任意の Objective-C クラスを拡張できます。たとえば、長さ、バイトの合計、またはその他の適切な値を返す NSData の intValue メソッドを定義できます。

  3. protocolを宣言して、要件を形式化します。次に、プロトコルへの準拠をテストするか、コンパイル時のチェックに依存して、配列に配置したオブジェクトがプロトコルに準拠していることを確認できます。

できることはたくさんありますが、クラス階層の C++/Java モデルから少し離れる必要があります。その点で、Objective-C ははるかに柔軟です。

于 2011-11-29T14:08:27.400 に答える