Есть ли разница между делегатом / селектором и целью / действием? - PullRequest
7 голосов
/ 14 июня 2009

При написании Cocoa и реализации метода класса, который принимает делегат и один или несколько селекторов для использования в качестве своих обратных вызовов, меняется ли терминология с «делегат» и «селекторы» на «цель» и «действие»? Более того, «делегат» ограничен только тем, когда мой класс получает с именем , но не когда мой класс выполняет вызов ?

Ответы [ 4 ]

13 голосов
/ 14 июня 2009

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

Цель / Действие, как правило, используются для соответствия «подобной событиям» ситуации, такой как щелчок, срабатывание таймера и т. Д.

3 голосов
/ 04 сентября 2012

Для уточнения ответа NilObject делегаты реализуются через протоколы с помощью серии «стандартизированных» методов. Если у вас есть несколько объектов, каждый из которых имеет один и тот же класс, и один и тот же делегат, вы не сможете различить отправителя. Следовательно, вы видите - (void) DelegateCallback: (ID) отправитель указатель отправителя позволяет вам сделать эту связь.
Чтобы сделать это сравнение, ссылка на отправителя потребуется в качестве свойства или глобальной переменной, это также упрощает, если вы вручную освобождаете свой объект, поскольку вы можете установить свойства объектов равными nil перед освобождением (чтобы предотвратить использование указателей мусора).

В качестве альтернативы вы можете использовать метод селектора, чтобы передать свой собственный метод для обратного вызова, этот метод хорош, поскольку вам не требуется ссылка для сравнения с отправителем: (id), и вы можете иметь обратный вызов метода для каждого объект, который вы инициализируете. С другой стороны, отсутствие ссылки означает, что если вы отпустите этот объект, вы не сможете установить свойства равными nil.

1 голос
/ 27 февраля 2017

Я думаю, что есть разница на уровне дизайна.

Давайте возьмем компонент, который специализируется на некоторых вещах. И Delegation, и targetAction облегчили бы (некоторую форму) связь между нашим компонентом и потребляющим его объектом.

Обычно, какая форма связи желательна, определяет, использовать ли Target Action или Delegation.

1. Что общается?

Target Action больше подходит, когда связь ограничена control (события, состояние и т. Д.)

Делегирование гораздо более гибкое и имеет широкое применение. Поэтому я могу использовать делегирование для отправки и получения данных между 2 объектами.

2. Как

До сих пор я видел, как Целевое Действие в основном проявлялось 1-Way коммуникация

С делегированием я сам установил 2-стороннюю связь с помощью методов, возвращающих значения.

0 голосов
/ 30 мая 2017
Target  - the object which is going to respond for your action.
Action - the method which is triggered by your action
Delegates - Majorly used for callback mechanism, implemented using "@protocols".
Selector - also can be used as callback method:

Например:

SEL mySelector = @selector(myTimerCallback:);
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES];
...