Для ясности ответ НЕТ - они не одинаковы.
Различия изложены Джоном Калсбиком в принятом ответе, но я бы сказал, что ключевым отличием является то, что миксины могут использоваться в разных классах, тогда как категории всегда расширяют ровно один класс - который они объявляют в своем определении.
Это ключевое различие, поскольку оно означает, что варианты использования этих двух функций совершенно разные. Еще один способ взглянуть на это так: если вы переходите с Ruby на Objective-C и пропускаете свои миксины, вы не найдете никакой радости с категориями.
Вариант использования для миксинов заключается в том, что у вас есть некоторый код - методы и переменные экземпляра - которые вы хотите использовать повторно в нескольких классах, которые не имеют общего суперкласса. Вы не можете сделать это с категориями.
Mixins - это "множественное наследование" того типа, которого вы не найдете в Objective-C. Самая близкая вещь в target-c - это протоколы, так же как самая близкая вещь Java - это интерфейсы, но они не имеют ни переменных экземпляра, ни тел методов (в target-C или java). Таким образом, вы обычно создаете вспомогательные классы или помещаете код в суперклассы.
Вариант использования для категорий target-c заключается в том, что вы хотите добавить методы в существующий класс - даже класс системы или библиотеки.
Я бы сказал, что миксины более мощные, но так как это сравнение яблок с апельсинами, это было бы бессмысленно.
Чтобы быть точным:
Ruby-эквивалент Категорий, это просто повторное открытие класса, который вы хотите расширить и расширить его. (Вы можете сделать это где угодно в Ruby, и он фактически идентичен категориям)
Я не уверен, что цель-c эквивалентна Mixins, хотя - кто-нибудь?
[Update] Немного больше поиска, и нет никакого эквивалента Mixins в Objective-C, но предприимчивый Владимир Митрович создал библиотеку, которая эффективно это делает. https://github.com/vl4dimir/ObjectiveMixin
У меня две мысли о том, использовать ли его или нет: иногда, если используемый вами язык не поддерживает что-либо, легче работать с ним, чем бороться с ним или пытаться импортировать ваши любимые функции из Другие языки. («Если ты не можешь быть с тем языком программирования, который любишь, люби тот, с кем ты»).
Опять же, возможно, это просто немного издеваться над мной. Целое движение по аспектно-ориентированному программированию годами привлекало внимание к Java (но я мог бы добавить, что за пределами JBoss он никогда не набирает обороты). В любом случае, Владимир получает дополнительные похвалы за использование Черепашек ниндзя в своем примере.
На другом боковом узле: как относительный объект-c noob, мне кажется, что категории чрезмерно используются в примере кода, который я нахожу во всем Интернете. Кажется обычной практикой добавлять статические вспомогательные методы в системные классы с категориями, когда было бы так же просто создать вспомогательный класс для размещения этих методов в вашем проекте, с меньшим риском их поломки при обновлении системного класса или при импорте. чужая библиотека со своими собственными такими категориями. Типичным примером является добавление новых статических методов цвета в UIColor. Почему бы просто не добавить их в локальный класс?
Единственное хорошее применение, которое я видел для категорий, - это добавление методов не в системные классы, а в сгенерированные классы. Поэтому, когда вы генерируете классы из объектной модели базовых данных и хотите добавить новые конструкторы или другие методы, которые действительно принадлежат в классе модели, вы можете сделать это с категориями, что позволит вам безопасно восстановить класс модели, если вы смените модель, не потеряв работу.
В итоге:
- забудьте о категориях как о решении для миксинов
- категории хороши для базовых данных, но переоценены и переоценены в противном случае