Что такое делегат в Cocoa

Делегирование это паттерн при котором один объект координирует свои действия с другим. Делегирующий объект содержит ссылку на другой объект - делегат - и когда нужно посылает ему сообщения. Сообщение извещает делегат о том что делегирующий объект обработал или поймал событие. Делегат может ответить на событие обновив состояние своё или другого объекта, или вернуть значение, которое влияет на обработку события. Делегирование нужно для легкой настройки поведения нескольких объектов в одном центральном.

Делегирование в Cocoa Frameworks
The delegating object is typically a framework object, and the delegate is typically a custom controller object. In a managed memory environment, the delegating object maintains a weak reference to its delegate; in a garbage-collected environment, the receiver maintains a strong reference to its delegate. Examples of delegation abound in the Foundation, UIKit, AppKit, and other Cocoa and Cocoa Touch frameworks.

An example of a delegating object is an instance of the NSWindow class of the AppKit framework. NSWindow declares a protocol, among whose methods is windowShouldClose:. When a user clicks the close box in a window, the window object sends windowShouldClose: to its delegate to ask it to confirm the closure of the window. The delegate returns a Boolean value, thereby controlling the behavior of the window object.

Framework object sending a message to its delegate

Delegation and Notifications
The delegate of most Cocoa framework classes is automatically registered as an observer of notifications posted by the delegating object. The delegate need only implement a notification method declared by the framework class to receive a particular notification message. Following the example above, a window object posts an NSWindowWillCloseNotification to observers but sends a windowShouldClose: message to its delegate.

Data Source
Источник данных во многом похож на делегат. Разница в связи с делегирующим объектом. Instead of being delegated control of the user interface, a data source is delegated control of data. Делегирующий объект, обычно view-объект такой как table view, содержит ссылку на data source и запрашивает данные для отображения. Источник данных, как делегат, должен реализовать минимум методов протокола. Data sources are responsible for managing the memory of the model objects they give to the delegating view.

--