В целом синтаксис @interface ClassName (CategoryName)
предназначен для объявления категории. Категории - это способ добавления методов в класс. Вы можете сделать это даже с классами, для которых у вас нет исходного кода. См. Больше here.
@interface ClassName()
(без ничего в круглых скобках) по существу является особым случаем категории и называется расширением класса. Основное различие между расширением класса и категорией состоит в том, что методы, объявленные в расширении класса, должны быть определены/реализованы в основном блоке @implementation для класса или вы получите предупреждение о компиляторе. Методы в обычной категории могут быть определены во внешнем блоке @implementation.
Наиболее распространенное использование расширений класса (как в данном случае) для объявления частных методов. Objective-C не поддерживает истинные частные методы, поэтому простой способ добиться того же базового конечного результата - объявить частные методы в расширении класса в верхней части файла .m. Поскольку эти методы не определены в файле .h, другие классы их не видят, и вы получите предупреждение о компиляторе, если попытаетесь использовать их вне класса, к которому они принадлежат.
Вы также можете обновить readonly @property как readwrite в расширении класса. Таким образом, код, внешний по отношению к реализации класса, может читать только значение свойства, но внутри реализации класса вы также можете написать ему. Это единственный случай, когда разрешено переопределять @property.
(Обратите внимание, что расширения классов были новая функция в Objective-C 2.0 и не доступны на Mac OS X 10.4 и более ранних версий.)
См http://stackoverflow.com/questions/862299/how- do-a-category-work-in-objective-c – XJones