Делегирование по категории - PullRequest
2 голосов
/ 13 мая 2011

Может ли кто-нибудь различать, когда мы используем делегирование по категориям и наоборот. Я уверен в этом.

Спасибо

Ответы [ 3 ]

5 голосов
/ 13 мая 2011

Категория позволяет добавлять новые методы или перезаписывать существующие методы в классе, что позволяет расширять класс без создания подклассов.Добавление методов является наиболее полезной целью, перезапись может пойти не так, если вы точно не знаете, что делает расширяемый класс.

Это скорее языковая функция, а не шаблон, она работает для каждого класса.

Делегат - это шаблон, а не языковая функция, для которого должен быть закодирован класс, который предполагается использовать, иначе он не будет работать.

Обычно делегат требуется для реализации протокола, известного классу, который собирается получить делегат.Затем класс будет использовать делегата для выполнения того, для чего он был закодирован, некоторые из наиболее распространенных - это отправка уведомлений с использованием части шаблона стратегии, которая задает вопрос в определенной части кода для принятия решений на основе реализации конкретного делегата., позволяя делегату выполнить действие или любую их комбинацию.

Например, UIApplicationDelegate - это протокол уведомлений (application:didFinishLaunchingWithOptions:) и действий (application:openURL:sourceApplication:annotation:), UITextFieldDelegate - это уведомления (textFieldDidBeginEditing:) и стратегия(textField:shouldChangeCharactersInRange:replacementString:).

На самом деле я могу представить себе использование категории для реализации делегирования во всех этих случаях, о которых я говорил выше: отправка уведомлений, выполнение действий, участие в стратегии.Но это потребовало бы, чтобы вы очень хорошо знали, что делает расширенный класс, возможно, чтобы он имел код, иначе вы можете очень легко сломать класс или быть нарушенным реализацией измененного класса.Так что это использование было бы на мой взгляд крайне неправильно.

1 голос
/ 14 мая 2011

категория: Добавляет методы в существующий класс .

делегат: Изменяет поведение другого объекта , позволяя другому объекту, делегату, участвовать в операции объекта.

Допустим, у вас есть приложение для iOS с тремя таблицами. Даже если они настроены одинаково, каждая из этих таблиц может вести себя по-разному, если у них разные делегаты.

Вы не можете сделать это с категорией, потому что категория в равной степени применяется ко всем экземплярам класса, который она расширяет. С другой стороны, если вы хотите расширить класс UITableView для добавления новых возможностей, вам нужна категория *. Делегаты зависят от конкретного экземпляра и ограничиваются ролью, предусмотренной для них разработчиком класса делегирования.

* или подкласс, конечно.

0 голосов
/ 13 мая 2011

Категории используются, когда вам нужно расширить класс без создания подкласса, например, когда вам нужно добавить метод с именем isURL в строку NSString, вы можете использовать категории следующим образом, здесь мы не создаем подкласс, вместо этого мырасширяют реализацию.

@interface NSString (Utilities) 
- (BOOL) isURL; 
@end 

Делегаты похожи на функции обратного вызова,

...