Форум программистов, компьютерный форум CyberForum.ru

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Surfaker
3 / 3 / 1
Регистрация: 01.04.2014
Сообщений: 118
#1

Не понимаю делегирование - Objective-C

15.10.2014, 18:06. Просмотров 1187. Ответов 16
Метки нет (Все метки)

Доброго времени суток всем! Изучаю objC недолго, имею небольшой опыт в Си/Си++
Объясните мне, пожалуйста, зачем нужны делегаты? Все что находил в интернете - не понимал. Принцип их работы я вроде как понимаю, как и протоколов вцелом, но вот их предназначение мне неясно.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
15.10.2014, 19:07     Не понимаю делегирование #2
от их предназначение мне неясно.
Например:
- Чтобы обработать Получение или потерю фокуса в UITextField
- Чтобы создать ДатаСурс для UITableView
- Чтобы получить ответ от NSURLConnection

и этот список можно продолжать до бесконечности.
Surfaker
3 / 3 / 1
Регистрация: 01.04.2014
Сообщений: 118
15.10.2014, 19:21  [ТС]     Не понимаю делегирование #3
noname_club, проще говоря, со временем придет и сейчас достаточно просто понимания? просто до юзер интерфейса я еще не дошел.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
15.10.2014, 20:08     Не понимаю делегирование #4
понимание приходит вместе с "юзер интерфейсом"
Melzas
38 / 38 / 4
Регистрация: 20.07.2011
Сообщений: 88
15.10.2014, 23:11     Не понимаю делегирование #5
Делегаты в Objective-C - это реализация паттерна делегирования, о котором можно прочитать в любой книге по паттернам. Если кратко - то класс с их помощью может делегировать выполнение какой-то части своего поведения другому классу. Думаю все станет понятно когда дойдет дело до UITableView.

Правда в стандартной библиотеке делегаты еще и часто выполняют роль паттерна наблюдатель (классы с помощью делегата сигнализируют о наступлении какого-либо события).
vitali36
7 / 7 / 2
Регистрация: 09.02.2014
Сообщений: 91
16.10.2014, 14:24     Не понимаю делегирование #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тоже раньше не мог долго понять делегирование. Причем использование делегатов tableview это одно, а создание своего - другое. Теперь, понимая как он работает и для чего нужен, постоянно приходится их использовать. К примеру возьмем самое простое: есть текстовое поле при нажатии на которое у нас вылазит модальный контроллер или поповер, содержащий UIDatePicker барабан. И когда мы меняем значение в барабане, изменения отображаются в uitextField. В чем вся суть: У нас два контроллера: в первом у нас сам UITextField, а во втором есть IBAction для UIDatePicker. Мы создаем в этом классе делегат(протокол), который имеет метод, одним из арументов которого будет NSDate а также проперти для этого делегата. В IBAction мы вызываем его (self.delegate getDateFromController:self withDate:value.(т.е мы передаем value, в котором содержится значение с барабана). Далее: в первом контроллере мы указываем длегат (можно в хедере, можно в имплементации),предварительно импортировав второй контроллер. Создаем проперти второго контроллера например secondController и говорим secondController.delegate, где delegate - это имя проперти делегата из второго контроллера. И реализуем наш метод из протокола. Внутри этого метода мы можем написать myField.text = наше значение аргумента, содержащее дату. ПРедварително нужно будет сделать некоторые манипуляции с датой, чтобы она была строкой, но это уже от темы. Посторался разжевать все, как мог. Надеюсь, понятно))
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
16.10.2014, 15:21     Не понимаю делегирование #7
Для меня загадка, как можно не понимать паттерн, точный и полный смысл которого уместился в его названии.
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
16.10.2014, 15:33     Не понимаю делегирование #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
полный смысл которого уместился в его названии
Как бы перевод этого слова все равно только "косвенно" указывает на то что происходит в действительности.

В действительности класс А вызывает Метод класса B и все.
То есть это по сути Это Интерфейс (Вызов методов из абстрактного класса).
Как это "по-русски" или "по-грамотному" назвать кроме как Delegate неизвестно.
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
16.10.2014, 17:52     Не понимаю делегирование #9
Есть небольшой вопрос. Если протокол не принимать, а просто реализовать метод из протокола класса А в другом классе(Б), то при вызове метода в классе А вызовется и метод Б.
Не говоря уже о том, что вызвать вызвать метод из другого класса можно и вовсе без объявления протокола, просто передав указатель на класс, в котором должен быть выполнен метод.
Зачем тогда объявлять и реализовывать протокол, не считая того, что при его принятии и дальнейшем написании кода среда "подскажет" его полное название при наборе первых букв/слов?
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
16.10.2014, 19:16     Не понимаю делегирование #10
Зачем тогда объявлять и реализовывать протокол, не считая того, что при его принятии и дальнейшем написании кода среда "подскажет" его полное название при наборе первых букв/слов?
Вызов анонимных селекторов это говнокод. "По правилам" нужно объявить интерфейс(протокол), подключить его к классу, чтобы было видно что используется и зачем.

Добавлено через 8 минут
просто передав указатель на класс, в котором должен быть выполнен метод
Смысл интерфейсов в том что они не требуют записи реализации исходного кода методов. (Абстрактный класс) Это значит что их может унаследовать любой класс.

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

Objective-C
1
2
3
// пример свойства-объекта делегирования
@property (weak,nonatomic) id<UITableViewDelegate> delegate; 
// объект делегирования может быть ЛЮБЫМ классом
vitali36
7 / 7 / 2
Регистрация: 09.02.2014
Сообщений: 91
17.10.2014, 00:01     Не понимаю делегирование #11
Присоединяюсь к noname_club по поводу правил. Возьми себе за правило делать так, как делает apple. Есть определенная культура языка, паттерны, которым нужно следовать
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
17.10.2014, 06:34     Не понимаю делегирование #12
Цитата Сообщение от vitali36 Посмотреть сообщение
Присоединяюсь к noname_club по поводу правил. Возьми себе за правило делать так, как делает apple. Есть определенная культура языка, паттерны, которым нужно следовать
Я пишу по правилам. Просто иногда бездумно следую им, не люблю так.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2014, 09:59     Не понимаю делегирование #13
vitali36, вот ненужно про "которым нужно следовать". Все зависит от архитектуры, сложности, и размера проекта.
Цитата Сообщение от vitali36 Посмотреть сообщение
Возьми себе за правило делать так, как делает apple
Если посмотреть то, что они выкладывают в качестве "примеров" - так у них говнокодеры работают.
Реальный код вы и не увидите, кроме того, что в opensource(Но это чаще всего достаточно низкоуровневые наработки типа CFArray)
И во многих случаях делать как в примере нельзя. Пример сделан только для того, чтобы продемонстрировать proof of concept.

residentkms, а вы и не следуйте бездумно. Какой в этом смысл?
residentkms
21 / 21 / 8
Регистрация: 20.10.2013
Сообщений: 138
Завершенные тесты: 1
17.10.2014, 10:30     Не понимаю делегирование #14
Цитата Сообщение от zulkis Посмотреть сообщение
residentkms, а вы и не следуйте бездумно. Какой в этом смысл?
вот поэтому я спросил.
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
17.10.2014, 10:33     Не понимаю делегирование #15
Цитата Сообщение от noname_club Посмотреть сообщение
Как бы перевод этого слова все равно только "косвенно" указывает на то что происходит в действительности.
Не нужен никакой перевод. Слово "делегирование" есть в русском языке и имеет ровно тот смысл, который заложен в паттерне.
Цитата Сообщение от zulkis Посмотреть сообщение
Если посмотреть то, что они выкладывают в качестве "примеров" - так у них говнокодеры работают.
Реальный код вы и не увидите, кроме того, что в opensource
Это да, но обычно достаточно интерфейс посмотреть, чтобы понять, как разработчик предполагал работу со своим классом и даже как он примерно реализован внутри и этого вполне достаточно. С архитектурой фреймворков у них все в порядке, поэтому почему бы и не взять за образец.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.10.2014, 11:46     Не понимаю делегирование #16
glvrzzz, фрэймворки да, и абстракциями они начали знатно пользоваться. Но я конкретно про код, что на developer.apple.com к комментарию про "делать все как у apple". Так просто не выйдет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2014, 17:40     Не понимаю делегирование
Еще ссылки по теме:

C++ Builder Делегирование события
Делегирование Objective-C
Делегирование
Objective-C Не понимаю ошибки и что требует программа
Делегирование событий jQuery

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Surfaker
3 / 3 / 1
Регистрация: 01.04.2014
Сообщений: 118
17.10.2014, 17:40  [ТС]     Не понимаю делегирование #17
всем спасибо за ответы.
Yandex
Объявления
17.10.2014, 17:40     Не понимаю делегирование
Ответ Создать тему
Опции темы

Текущее время: 14:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru