web-dev-qa-db-ja.com

目的C:クラスIDを指定して、このクラスが特定のプロトコルを実装しているかどうかを確認できますか?または特定のセレクターがありますか?

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

39
Jacko
_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)]を確認します。

15
BJ Homer
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
270
Chuck