Objective Cの:このクラスは、特定のプロトコルを実装している場合、クラスIDを指定するには、私が確認できますか?または特定のセレクタを持っていますか?
-
23-09-2019 - |
質問
私は、オブジェクトファクトリのためにこれを使用する:文字列を考えると、クラスを作成し、もし このクラスは、クラスやコールを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];
}
所属していません StackOverflow