Категория позволяет добавлять новые методы или перезаписывать существующие методы в классе, что позволяет расширять класс без создания подклассов.Добавление методов является наиболее полезной целью, перезапись может пойти не так, если вы точно не знаете, что делает расширяемый класс.
Это скорее языковая функция, а не шаблон, она работает для каждого класса.
Делегат - это шаблон, а не языковая функция, для которого должен быть закодирован класс, который предполагается использовать, иначе он не будет работать.
Обычно делегат требуется для реализации протокола, известного классу, который собирается получить делегат.Затем класс будет использовать делегата для выполнения того, для чего он был закодирован, некоторые из наиболее распространенных - это отправка уведомлений с использованием части шаблона стратегии, которая задает вопрос в определенной части кода для принятия решений на основе реализации конкретного делегата., позволяя делегату выполнить действие или любую их комбинацию.
Например, UIApplicationDelegate
- это протокол уведомлений (application:didFinishLaunchingWithOptions:
) и действий (application:openURL:sourceApplication:annotation:
), UITextFieldDelegate - это уведомления (textFieldDidBeginEditing:
) и стратегия(textField:shouldChangeCharactersInRange:replacementString:
).
На самом деле я могу представить себе использование категории для реализации делегирования во всех этих случаях, о которых я говорил выше: отправка уведомлений, выполнение действий, участие в стратегии.Но это потребовало бы, чтобы вы очень хорошо знали, что делает расширенный класс, возможно, чтобы он имел код, иначе вы можете очень легко сломать класс или быть нарушенным реализацией измененного класса.Так что это использование было бы на мой взгляд крайне неправильно.