Одна действительно веская причина для использования общедоступной категории, которую Apple часто использует, заключается в расширении класса с помощью функциональности, которая существует в структуре категории, но которая не существует в структуре, которая определяет класс. Например, NSString определен в Foundation.framework, но категории в NSString, определяющие методы рисования NSString на экране, определены в AppKit.framework.
Другое хорошее использование категорий - для сокрытия зависимостей; например, если вам действительно нужно повышение для части класса, это может быть в отдельном заголовке и файле реализации, и пользователь класса, которому нужны части повышения, может импортировать этот заголовок вместе с заголовком, изначально определяющим класс, и только этот файл займет много времени для компиляции. Это более полезно в 64-разрядной среде выполнения, где категория может добавлять переменные экземпляра.
Действительно большая реализация для нескольких исходных файлов (но с одним заголовком) также является хорошим кандидатом, как отмечает Том:)
Я просто хотел бы добавить к первоначальному ответу Тома: как правило, при объявлении частных методов лучше использовать расширение класса, чем категорию класса. Таким образом, вы можете реализовать расширение в том же блоке @implementation, что и публичные методы, не получая предупреждения о «отсутствующей реализации категории». Пример:
// .h file
@interface Foo : NSObject
-(void)publicMethod;
@end
// .m file
@interface Foo ()
// Notice the empty paren; this is how you define
// a class extension, which is not the same as a category
-(void)somePrivateMethod;
@end
@implementation Foo
#pragma mark Public methods
-(void)publicMethod;
{ ... }
#pragma mark Private methods
-(void)privateMethod;
{ ... }
@end