Категория доступа к закрытым методам основного класса - Цель C
В связи с обстоятельствами того, что я программирую, мне нужно реализовать некоторые методы в классе без фактического редактирования класса, поэтому я использую категории.
Проблема в том, что есть методы, не включенные в интерфейс класса, но реализованные в реализации класса. Я предполагаю, что это просто означает, что они являются частными методами.
Разве не возможно, чтобы категория имела доступ к закрытым методам своего основного класса? Когда я пытаюсь использовать один из частных методов в моей категории, я получаю сообщение об ошибке:
Msgstr "Нет видимого @interface для 'MainClass', объявляет селектор 'privateMethod'"
Это понятно, потому что его нет в интерфейсе, но я подумал, что логично будет иметь смысл, что я смогу получить доступ ко всему в реализации.
2 ответа
Методы, которые вы хотите вызвать, должны быть где-то объявлены. Вы можете объявить их самостоятельно, используя свою собственную категорию:
@interface MainClass(MyPrivateMethods)
- (CGRect)privateMethod:(NSString*)someParameter;
@end
Это избавит от предупреждения компилятора "Нет видимого @interface для 'MainClass' объявляет селектор", и вам остается только надеяться, что оно работает во время выполнения. Если MainClass
не имеет метода с таким именем с этими параметрами и возвращаемыми типами, тогда он потерпит неудачу во время выполнения.
(Вы также можете использовать performSelector:
но вы все равно можете получать предупреждения о нераспознанных селекторах, в зависимости от настроек вашего компилятора, и не работает со всеми параметрами и типами возвращаемых данных).
Существует стандартный способ справиться с этим.
@interface MainClass ()
- (void)privateMethod;
@end
Если вам нужен только доступ к методам в файле 1 .m, поместите объявление в верхней части этого файла. Если вам нужен доступ в более чем 1 .m файле, создайте заголовок MainClassSubclass.h для хранения этих методов.
Для примера этого шаблона, посмотрите на UIGestureRecognizerSubclass.h
в UIGestureRecognizer
По сути, вы превращаете свой закрытый метод в защищенный.