Иногда наследование кажется просто большим количеством проблем, чем оно того стоит. Он правильно используется, когда вы хотите добавить в существующий класс что-то, что является изменением поведения этого класса.
С категорией вы просто хотите, чтобы существующий объект делал немного больше. Как уже говорилось, если вы просто хотите иметь строковый класс, который обрабатывает сжатие, вам не нужно создавать подкласс строкового класса, вы просто создаете категорию, которая обрабатывает сжатие. Таким образом, вам не нужно менять тип используемых вами строковых классов.
Подсказка в том, что категории только добавляют методы, вы не можете добавлять переменные в класс, используя категории. Если классу нужно больше свойств, он должен быть разделен на подклассы (редактировать: я считаю, что вы можете использовать ассоциативное хранилище).
Категории - это хороший способ добавить функциональность и в то же время соответствовать объектно-ориентированному принципу, чтобы отдавать предпочтение композиции, а не наследованию.
Редактировать январь 2012
Все изменилось. С текущим компилятором LLVM и современной 64-битной средой исполнения вы можете добавить iVars и свойства к классу extensions (не по категориям). Это позволяет вам держать частные iVars вне публичного интерфейса. Но если вы объявите свойства для iVars, они все равно могут быть доступны / изменены через KVC, потому что в Objective-C до сих пор не существует такого понятия, как закрытый метод.