Категория доступа к закрытым методам основного класса - Цель 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


По сути, вы превращаете свой закрытый метод в защищенный.

Другие вопросы по тегам