0

以下に、さまざまなクラスと「タイプ」のオブジェクトをプログラムallocで作成する 2 つの方法を示します。init

- (id)buildObjectOfClass:(NSString *)classString andType:(NSString *)typeString
    {
    id buildObject;
    Class className             = NSClassFromString(classString);
    SEL initWithTypeSelector    = NSSelectorFromString(@"initWithType:");

    if ([className instancesRespondToSelector:initWithTypeSelector] == YES) {
        buildObject = [[className alloc] performSelector:initWithTypeSelector 
                                              withObject: typeString];
    }
    return buildObject;
}

このメソッドの実装は、元々、次のように簡潔に記述されていました。
{ return [[className alloc] initWithType:typeString]; }

私の質問は次のとおりです。1) 詳細バージョンは必要ですか? 2) もしそうなら、それは可能な限り最善にプログラムされましたか? 私が無視しているショートカットやベストプラクティスはありますか?

4

1 に答える 1

2

このメソッドの詳細バージョンと簡潔バージョンの違いは-initWithType:、標準のNSObjectinit 関数ではないクラス インスタンスが実際に応答できることを詳細バージョンが検証することです。

次のいずれかに該当する場合は、冗長バージョンを使用する必要はありません。

  • あなたは使用しているだけで、使用-initしていません-initWithType:
  • インスタンス化するすべてのクラスが処理できることは確かです-initWithType:
  • インスタンス化したクラスが応答しない場合、未知のメソッド例外でアプリケーションが予期せず終了してもかまいません。-initWithType:

このバージョン (ただしbuildObject、エラー ケースを明示的に処理するには nil に設定する必要があります) はnil、クラスが見つからない場合、または に応答しない場合に戻ります-initWithType:。クラスが見つからない場合は簡潔なバージョンが返さnilれ、クラス インスタンスが応答しない場合は例外がスローされ-initWithType:ます。

于 2013-05-14T16:38:26.153 に答える