У меня есть несколько источников данных, которые я использую для одного UIViewController. Контроллер My view использует KeyValue Observing для отслеживания состояния определенных свойств во время выполнения. Когда я заменяю dataSources, мне нужно прекратить наблюдать за этими свойствами. Проблема заключается в том, что я не уверен в классе DataSource во время выполнения, для этого что-то вроде это не действует:Как типизировать идентификатор для конкретного класса динамически во время выполнения?
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 в этом конкретном случае, а затем typcast dataSource для removeObserver: forKeyPath: селектор выше? Я предпочитаю что-то динамическое/умнее кэширования имени класса в экземпляре NSString и ссылаясь на это при каждом переключении. Смысл, я всегда мог бы сделать что-то вроде:
NSString *lastDataSource = @"MyClass";
Class foo = [NSClassFromString(lastDataSource)];
Спасибо.
Нет, даже если я согласую свой объект типа 'id' с номером, я получаю предупреждение: '-removeObserver: forKeyPath:' не найден в протоколах –
2009-05-22 17:54:33
Комментарий newacct верен и не подходит, t downvote. предупреждение является безобидным, пока программист может быть уверен, что метод будет установлен во время выполнения. любить или ненавидеть, ObjC основан на концепции, известной как утиная печать. – harms
Так что, если вы не ставите на него протокол? Просто «id». Что вы получаете? – newacct