Я бы сказал, да, это плохая практика. Идея, лежащая в основе делегата, состоит в том, что это фактически отдельный объект, который получает сообщения об объекте, для которого он является делегатом («делегатом»). Делегат должен иметь ссылку на делегата, а не наоборот, иначе это уже не настоящие отношения делегирования.
Предпочтительный способ выполнить то, что вы просите, - предоставить отправляющий объект вместе с любым сообщением, полученным вашим делегатом. Например, в вашем делегате вместо того, чтобы иметь свойство delegator
и затем получить, например, метод didDoSomething:(id)anObject
, вы можете удалить свойство delegator
и отправить сообщение delegator:(id)anObject didDoSomething:(id)anotherObject
. Таким образом, вы сохраняете делегат отличным от делегатора, но по-прежнему получаете доступ к свойствам делегата, когда они вам нужны.
Этот способ также имеет то преимущество, что не предоставляет доступ к делегатору в методах, когда он вам действительно не нужен; например, ваш делегат может иметь метод didDoSomething
, который не принимает аргументов, даже делегат, и просто используется для ведения журнала, а также метод delegator:(id)anObject didSomethingElse:(id)anotherObject
, который вызывает некоторые свойства в делегаторе и гораздо более сложен.
Наконец, этот метод позволяет использовать один и тот же делегат для нескольких делегатов, поскольку вам не нужно обновлять свойство delegator
для каждого объекта делегата.
Для хорошего примера того, как это работает, взгляните на документацию NSURLConnection , в частности, на методы делегатов - многие из них принимают форму connection:didDoSomething:
, где первым аргументом является вызов соединения делегат. Разработчики обычно определяют один делегат соединения для нескольких соединений, реализуя свои методы делегата, чтобы делать разные вещи в зависимости от переданных в свойствах объекта NSURLConnection.