私は1つのUIViewControllerに使用するいくつかのデータソースを持っています。私のビューコントローラは、実行時に特定のプロパティの状態に従うために、KeyValue Observingを使用します。私がdataSourceを交換するとき、私はそれらのプロパティの観察を停止する必要があります。問題は、私は、実行時にデータソースのクラスのわからないんだけど、そのため、このようなものが有効ではありません、次のとおりです。実行時にIDを具体的なクラスに動的に型変換する方法はありますか?
if (aDataSource != dataSource) {
// Ensure we stop observing the existing dataSource, otherwise bad stuff can happen.
[dataSource removeObserver:self forKeyPath:@"someKeyPath"]; // not valid, compiler doesn't know what class dataSource is.
[dataSource release];
dataSource = [aDataSource retain];
}
コンパイラは、オブジェクトのインターフェイスを知るために具象クラスを必要とします。この特定のケースでdataSourceのクラスを取得するにはどうしたらいいですか?上記のremoveObserver:forKeyPath:selectorのdataSourceをtypcastしますか? NSStringインスタンスのクラスの名前をキャッシュして、それを私が切り替えるたびに参照するよりも、ダイナミックでスマートなものが好きです。意味は、私はいつものような何かをすることができる:
NSString *lastDataSource = @"MyClass";
Class foo = [NSClassFromString(lastDataSource)];
ありがとう。
いいえ、タイプIDがになっても、「-removeObserver:forKeyPath:」プロトコルに見つかりません –
newacctのコメントは正しいですし、それを下降させる。プログラマがメソッドが実行時に確保されることが確実である限り、警告は無害です。 ObjCはダックタイピングと呼ばれるコンセプトに基づいています。 – harms
その上にプロトコルを置かないとどうなりますか?ちょうど "id"。何を手に入れますか? – newacct