Протоколы и делегаты для чайников - PullRequest
8 голосов
/ 06 января 2012

Я пытался понять это, обещаю! Существует множество информации об этом, и я все еще погружен в море абстрактных понятий! Это как когда я был ребенком, и никто не мог объяснить мне, почему страна не может просто печатать больше денег и быть по-настоящему богатой. Я не настолько отсталый с большинством этих вещей, но по какой-то причине я не могу обернуть голову вокруг этой концепции, поэтому был бы очень признателен, если бы кто-то мог изложить это как можно более покровительственно «разговаривая с 4-летним» медленно !

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

Итак, последовательность:

  1. В объекте контроллера создан целевой метод.
  2. Вид выбран и графически связан с этим методом.
  3. В этом представлении происходит событие, которое запускает метод из контроллера.

Протоколы и делегаты приводят меня в замешательство. Я знаю, что это как-то связано с тем, что объекты могут разговаривать друг с другом, но я попытался выписать свое (недостаточное) понимание ниже и просто удалил его, так как считаю, что лучше не расставать узлы в моем нынешнем мышлении, а просто протрите планшет и начните заново. Если кто-нибудь может потратить немного времени на объяснение цели

  1. Использование делегатов / протоколов в отличие от цели / действия
  2. Составляющие кода и где он живет
  3. Последовательность событий, которые происходят при использовании процесса

Буду вечно благодарен.

Судя по некоторым комментариям к другим объяснениям, я чувствую, что я не единственный, кто немного потерян, так что, надеюсь, это будет иметь общее значение. Большое спасибо!

Edit:

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

Мой образец взят из Apple Docs , с Window в качестве объекта просмотра и WindowDelegate в качестве делегата, где щелчок по кнопке закрытия окна вызывает «должен ли я закрываться?» сообщение делегату.

Составляющие Кодекса: Окно (Вид) WindowDelegate (View Controller?)

  1. Объявите протокол, который делегат может использовать в разделе интерфейса окна (представление).
  2. Создайте экземпляр делегата в окне.
  3. Укажите, что WindowDelegate реализует протокол окна, включая: в его интерфейс. (здесь немного шатко?)
  4. Напишите необходимую реализацию методов в разделе реализации WindowDelegate (View Controller).
  5. В случае определенного события Window отправит сообщение WindowDelegate с определенной информацией.
  6. WindowDelegate обработает это и вернет ответ.

Где-нибудь вдоль правильных линий?

Ответы [ 4 ]

3 голосов
/ 06 января 2012

Здесь есть целая куча вещей, и кажется, что вы перепутали несколько вещей.

Во-первых, я бы посоветовал вам зайти на сайт разработчиков Apple и загрузить книги «Язык обучения Objective-C: Учебник для начинающих» и Objective-C.На данный момент не обращайте внимания на разводку интерфейса цели / действия, потому что звучит так, будто вам нужно понять некоторые основы Objective C. Здесь вы узнаете все о протоколах и т. Д. И других объектно-ориентированных вещах.

Во-вторых, есть множество очень хороших книг, которые шаг за шагом проведут вас через разработку приложения.Начало разработки iPhone 4: изучение iOS SDK - это то, что хорошо ценится.Это также, где вы узнаете о делегатах.

В-третьих, потратьте еще немного времени на изучение документации.документация SDK содержит множество статей, в которых рассказывается о том, как все работает, начиная с базового уровня, а также на сайте Apple Developer.

2 голосов
/ 20 июня 2014

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

Подклассы - это то, чего вы всегда должны избегать, так как это очень жесткая форма связи. Связывание - это когда два объекта зависят друг от друга для правильной работы, и чем больше связывание у вас есть, тем сложнее вносить изменения в вашу программу (потому что всякий раз, когда вам нужно изменить один объект, вы будете вынуждены вносить изменения в другой объекты, которые от него зависят).

Причина, по которой подкласс является формой связывания, заключается в том, что когда вы создаете подкласс из суперкласса, ваш подкласс будет зависеть от методов суперкласса (которые унаследован от подкласса). Поэтому, если вам нужно изменить суперкласс, вам, возможно, придется изменить все подклассы вместе с ним.

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

Таким образом, вместо того, чтобы создавать подклассы несколько раз, мы создаем группу экземпляров одного и того же класса и даем каждому свой объект-делегат, что мы можем сделать, так как тип id не указывает, какой тип объекта нам нужно использовать. Каждый отдельный объект делегата реализует этот метод по-разному, и мы избегаем подклассов.

0 голосов
/ 12 января 2012

Чтобы понять делегатов, взгляните на делегатов, предоставленных Cocoa.Например, NSWindow имеет метод делегата с именем - (void) windowWillClose: (NSNotification *) aNotification Если вы реализуете этот метод делегата, вы смотрите на уведомление, чтобы определить, какое окно должно быть закрыто, и выполните некоторую очистку для этого окна.Вы являетесь делегатом для объекта NSWindow в том смысле, что выполняете некоторую работу для объекта окна.

У всех методов делегата Какао есть имена, включающие такие слова, как «сделал», «будет», «должен» и т. Д. Они дают вашему коду возможность делать особые вещи в дополнение к обычным вещам, которыебудет сделано самими этими объектами - следовательно, вы являетесь делегатом для этих объектов.

0 голосов
/ 06 января 2012

Для делегатов вы можете взглянуть на этот вопрос .

Для протоколов вы можете проверить этот вопрос или посмотреть документацию .

Надеюсь, это поможет!

...