39

これをオブジェクト ファクトリに使用したい: 文字列を指定してクラスを作成し、このクラスが (Create() メソッドを使用して) プロトコルをサポートしている場合は、クラスを割り当てて Create を呼び出します。

4

2 に答える 2

271
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
于 2010-02-26T20:53:39.417 に答える
15
Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

ただし、上記のことを行うことで、Objective-C のひどいルールをどれだけ破っているのか指摘してもよろしいですか? たとえば、割り当てられているが初期化されていないインスタンスでメソッドを呼び出してはなりません。Xcode Static Analyzer は、メモリ リークに関するあらゆる種類の警告を表示します。

より良いオプションは次のとおりです。

[[[klass alloc] init] create];

しかし、init を呼び出したくないことを暗示しているようです。

[klass create]の所有されていないインスタンスを返すクラス メソッド: を考えることができますklass。次に、[klass respondsToSelector:@selector(create)]呼び出す前に確認します。

于 2010-02-26T20:47:59.490 に答える