Итак, вот решение, которое я нашел ... оказалось довольно простым, как только вы знали, что делать. Первая перезапись «- (идентификатор) forwardingTargetForSelector: (SEL) aSelector» и вернуть Ивар:
- (id) forwardingTargetForSelector:(SEL)aSelector{
return iVar;
}
Когда среда выполнения ищет метод и не может найти, то он будет вызывать этот метод, чтобы увидеть, если есть другой объект для пересылки сообщения. Обратите внимание, что этот метод обычно возвращает nil, и если вы вернете nil здесь, ваша программа выйдет из строя (что является подходящим поведением).
Вторая часть проблемы заключается в том, чтобы выгнать ошибки/предупреждения компилятора, которые вы получите при попытке отправить сообщение, которое не было объявлено. Это легко сделать, объявив категорию, которую вы не реализуете.
@interface Class (iVarClassMethods)
@propoperty (strong) Class *property1;
......more properties
@end
До тех пор, пока вы не положить в реализации где-нибудь, иначе @implementation Class (category)
, компилятор не будет жаловаться (он будет считать, что реализация где-то ....).
Теперь единственный недостаток, который я вижу, заключается в том, что если вы изменяете какие-либо свойства в интерфейсе iVar Class, вам нужно убедиться, что вы обновляете все другие классы, которые используют описанный выше метод, в противном случае вы столкнетесь, когда другой класс пытается отправить то, что теперь является неправильным методом (и компилятор не предупредит вас заранее). Тем не менее, это может быть получено. Вы можете объявлять протоколы в категории. Поэтому вместо этого вы создаете отдельный протокол для класса 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
Теперь, если вам нужно изменить какие-либо чтобы быть fowarded свойств/методов, изменить их в протоколе. Затем компилятор предупредит вас, когда вы попытаетесь отправить неправильный метод в класс пересылки.
Взгляните на этот вопрос (и мой собственный ответ на него): http://stackoverflow.com/questions/8763028/ Очень хороший вопрос! –
@ RichardJ.RossIII Спасибо за помощь. Сообщение на mikeash.com действительно помогло мне разобраться в этом вопросе. Я отправил ответ. –