Objective Cの:このクラスは、特定のプロトコルを実装している場合、クラスIDを指定するには、私が確認できますか?または特定のセレクタを持っていますか?

StackOverflow https://stackoverflow.com/questions/2344672

質問

私は、オブジェクトファクトリのためにこれを使用する:文字列を考えると、クラスを作成し、もし このクラスは、クラスやコールをALLOC(create()メソッドを持つ)プロトコルをサポートしています 作成します。

役に立ちましたか?

解決

Class klass = NSClassFromString(classname);
if ([klass instancesRespondToSelector:@selector(create)]) {
  [[klass alloc] create];
}

は月、私は、しかし、指摘のObjective-Cは、上記の操作を実行して、あなたのしているブレイクルールどれだけ多くのひどいですか?たとえば、あなたは、初期化されていない割り当てられた - しかし、インスタンスのメソッドを呼び出してはいけません。 Xcodeの静的アナライザは、あなたのメモリリークに関する警告のすべての種類を提供します。

より良いオプションは、このことだろう

[[[klass alloc] init] create];

しかし、あなたはINITを呼び出すにしたくないことを意味しているようだ。

[klass create]klassの非所有のインスタンスを返します。

あなたは、クラスのメソッドを検討することができます。次に、あなたはそれを呼び出す前に[klass respondsToSelector:@selector(create)]を確認したい。

他のヒント

NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
    id instance = [[class alloc] init];
    [instance create];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top