Хорошо, вот решение, которое я нашел ... оказалось довольно простым, когда вы знали, что делать.Сначала перезаписать '- (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
Теперь, если вам нужно изменить какие-либо из свойств / методов, которые следует использовать, вы измените их в протоколе.Затем компилятор предупредит вас, когда вы попытаетесь отправить неправильный метод классу пересылки.