これをオブジェクトファクトリに使用したい:文字列を指定してクラスを作成し、このクラスが(Create()メソッドを使用して)プロトコルをサポートしている場合は、クラスを割り当ててCreateを呼び出します。
_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)]
を確認します。
NSString *className; //assume this exists
Class class = NSClassFromString(className);
if ([class conformsToProtocol:@protocol(SomeProtocol)]) {
id instance = [[class alloc] init];
[instance create];
}