Когда & зачем вы используете @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. Таким образом, пользователи класса имеют доступ только для чтения, но сам класс имеет полный доступ.