Когда родитель имеет ссылку на дочерний объект, он должен использовать строгую ссылку. Когда у дочернего элемента есть ссылка на его родительский объект, ему следует использовать слабую ссылку, называемую unsafe_unretained.
По соглашению отношения делегатов в iOS обычно являются слабыми ссылками, поэтому вы обнаружите, что большинство свойств делегатов в собственных классах Apple объявлены как unsafe_unretained.
Таким образом, ваш контроллер сохраняет сервисы, которые он использует, но сервисы слабо связаны с контроллером. Таким образом, если контроллер освобожден, вся партия может быть безопасно удалена без каких-либо циклических ссылок.
Опасность в этом заключается в том, что если веб-служба выполняет какую-то длительную задачу, а контроллер освобождается до его завершения, служба остается с висящим указателем на свой теперь освобожденный делегат. Если он попытается отправить сообщение делегату, например «Я закончил», произойдет сбой.
Есть несколько подходов, которые помогут решить эту проблему (они не являются взаимоисключающими - вы должны попытаться сделать их все, когда это возможно):
1) Всегда устанавливайте свойства делегатов ваших служб равными nil в методе dealloc вашего контроллера. Это гарантирует, что когда контроллер освобождается, ссылки на делегаты на него устанавливаются на ноль (своего рода грубый, ручной эквивалент того, что слабые ссылки ARC делают автоматически).
2) При создании ваших собственных классов обслуживания, имеющих делегаты, сделайте так, чтобы они сохранили свой делегат во время работы, а затем освободите делегат, когда они будут сделаны. Таким образом, объект делегата не может быть освобожден, пока служба все еще отправляет ему сообщения, но он все равно будет освобожден, как только служба будет завершена (NSTimer и NSURLConnections оба работают таким образом - они сохраняют свой делегат во время работы и освобождают его когда они будут сделаны).
3) Старайтесь не иметь долгосрочных служб, принадлежащих чему-то временному, например контроллеру представления. Подумайте о создании одноэлементных объектов (экземпляров общих статических объектов), которые владеют вашими сервисами, чтобы сервис мог выполнять свою работу в фоновом режиме независимо от того, что происходит в слое представления. Контроллер по-прежнему может вызывать службу, но не владеет ею - служба принадлежит статическому объекту, который будет существовать в течение всего времени работы приложения, поэтому риск утечек или преждевременных выпусков отсутствует. Служба может связываться с контроллером через NSNotifications вместо вызовов делегатов, поэтому нет необходимости иметь ссылку на объект, который может исчезнуть. NSNotifications - отличный способ взаимодействия между несколькими классами без создания циклических ссылок.