Когда & зачем вы используете @interface ClassName (Private)? - Objective-C
Я смотрел какой-то код:
@interface ClassName (Private)
- (float)methodOne:(NSDictionary *)argOne;
- (void)methodTwo:(NSDictionary *)argTwo;
@end
@implementation ClassName
....
Вышеприведенный код находится в верхней части файла ClassName.m, который, как представляется, определяет дополнительные методы интерфейса для класса как частные?
Зачем? в чем смысл? Что еще может пойти, где (частный)? У кого-нибудь есть документы по этому поводу?
Спасибо
Ответы
Ответ 1
Это способ хранения методов, которые класс использует внутри себя, чтобы не подвергаться другим. Это часть инкапсуляции. В Objective-C 2.0 (iOS и Mac OS X 10.5+) более распространено использование расширения класса в верхней части файла реализации:
@interface ClassName ()
- (void)privateMethod;
@end
Расширение класса действительно просто частный случай категории (о чем вы просили). Основное различие заключается в том, что для категории компилятор не будет жаловаться, даже если ваша @implementation не включает определения для методов, объявленных в категории. Для методов в расширении класса ваш класс должен реализовать эти методы в своем основном блоке @implementation или вы получите предупреждение о компиляторе.
Вам лучше использовать расширение класса в коде iOS или в коде Mac, который предназначен, по крайней мере, для Mac OS X 10.5 Leopard.
Ответ 2
В основном это категория и позволяет добавлять методы в файл .m. В наши дни лучшим способом является расширение класса, синтаксис подобен простому "Private" отсутствует, всего две круглые скобки.
Дополнительным преимуществом расширения класса является то, что свойства также могут быть включены, и компилятор будет проверять, что все объявленные методы определены.
Одной областью, которая действительно удобна, является способность объявлять корректно readonly в файле .h и читать запись в файле .m. Таким образом, пользователи класса имеют доступ только для чтения, но сам класс имеет полный доступ.
Ответ 3
objective-c не поддерживает закрытый метод, и способ, которым вы спрашиваете, является заменой для этого.
вы можете проверить эту ссылку для подробностей:
Почему objective-c не поддерживает частные методы?