Я пытался решить, должен ли я оставить комментарий к другим ответам или оставить собственный ответ.Я решил, и вот оно.
Я в первую очередь разработчик на C #, поэтому я легко вижу, как можно заменить весь шаблон делегирования на блоки, потому что C # всегда рассматривал глаголы как граждан первого класса.На самом деле, это было одним из самых сложных моментов, когда я начал работать с Java и платформой Android.Этот опыт облегчил мне процесс изучения Objective-C и Cocoa.
Я думаю, что это детали реализации модели наблюдателя и модели делегирования, к которым я не особенно чувствую.У меня довольно сложная композиция, а не ориентированная на наследование, поэтому я часто использую шаблон делегирования, даже в C #.
Я не думаю, что один из них должен заменить другой.Я думаю, что эти два шаблона следует использовать там, где каждый является наиболее подходящим;однако я обнаружил несколько случаев, когда я определенно предпочел бы схему наблюдателей, а не модель делегирования в Какао.
Например, работа с результатом UIAlertView, на мой взгляд, должна основываться на блоках, а не на делегатах.Это всегда казалось мне немного странным, но блоки не были доступны, когда разрабатывали эту конкретную часть API.В результате я никогда не был уверен, считает ли Apple, что это предпочтительный подход, или это был единственный подход в то время.
Недавно я интегрировал GameKit в одну из своих игр и обнаружил, что большинствоасинхронные вызовы (на самом деле, все те, что я использовал) не используют делегатов;они используют блоки.Я думаю, что если бы они могли переписать UIAlertView сегодня, они, вероятно, использовали бы блоки вместо делегатов для обработки обратных вызовов после ввода данных пользователем.Конечно, это всего лишь предположение.
Краткий ответ на ваш вопрос: я предпочитаю шаблон делегирования при составлении объектов, чтобы избежать излишне сложных иерархий наследования, и предпочитаю шаблон наблюдателя, когда имею дело с аналогичными вещами.на события, такие как обратные вызовы и обработчики событий.Я использую делегаты для первого и блоки для второго.