Итак, вот решение, которое я нашел... оказалось довольно простым, когда вы знали, что делать. Сначала перезапишите «- (id) forwardingTargetForSelector: (SEL) aSelector» и верните iVar:
- (id) forwardingTargetForSelector:(SEL)aSelector{
return iVar;
}
Когда среда выполнения ищет метод и не может его найти, она вызывает этот метод, чтобы узнать, есть ли другой объект для пересылки сообщения. Обратите внимание, что этот метод обычно возвращает nil, и если вы вернете nil здесь, ваша программа рухнет (что является подходящим поведением).
Вторая часть проблемы заключается в том, чтобы скрыть ошибки/предупреждения компилятора, которые вы получите, когда попытаетесь отправить сообщение, которое не объявлено. Это легко сделать, объявив категорию, которую вы не реализуете.
@interface Class (iVarClassMethods)
@propoperty (strong) Class *property1;
......more properties
@end
Пока вы никуда не вставляете реализацию, также известную как @implementation Class (category)
, компилятор не будет жаловаться (он будет предполагать, что реализация где-то....).
Теперь единственный недостаток, который я вижу, это то, что если вы измените какое-либо из свойств в интерфейсе класса iVar, вам нужно убедиться, что вы обновляете все другие классы, которые используют метод, описанный выше, иначе вы будете падать, когда другой класс попытается отправить что сейчас является неправильным методом (и компилятор не предупредит вас заранее). Однако это можно обойти. Вы можете объявить протоколы в категории. Поэтому вместо этого вы создаете отдельный протокол для класса iVar и перемещаете нужные методы/свойства из класса iVar в протокол.
@protocol iVarClassProtocol
@propoperty (strong) Class *property1;
......more properties
@end
Добавьте этот протокол в подкласс iVar, чтобы теперь эти методы были объявлены через протокол.
@interface iVarClass <iVarClassProtocol>
....other methods/properties you don't need forwarded
@end
Наконец, просто добавьте протокол в категорию. Итак, вместо вышеупомянутой категории с явными объявлениями у вас будет:
@interface Class (iVarClassMethods) <iVarClassProtocol>
@end
Теперь, если вам нужно изменить какое-либо из свойств/методов, которые будут переданы, вы можете изменить их в протоколе. Затем компилятор предупредит вас, когда вы попытаетесь отправить неправильный метод классу пересылки.
person
Aaron Hayman
schedule
23.02.2012