Поскольку объект, отправляющий сообщения делегата, не является владельцем делегата.
Во многих случаях все наоборот, например, когда контроллер устанавливает себя в качестве делегата представления или окна: контроллеру принадлежит представление / окно, поэтому, если представлению / окну принадлежит его делегат, оба объекта будут владеть друг с другом. Это, конечно, цикл сохранения, похожий на утечку с тем же следствием (объекты, которые должны быть мертвыми, остаются живыми).
В других случаях объекты являются равноправными: ни один не владеет другим, возможно, потому что они оба принадлежат одному и тому же третьему объекту.
В любом случае объект с делегатом не должен сохранять своего делегата.
(Кстати, есть, по крайней мере, одно исключение. Я не помню, что это было, и я не думаю, что для этого были веские причины.)
Приложение (добавлено 2012-05-19): в ARC вы должны использовать weak
вместо assign
. Слабые ссылки автоматически устанавливаются на nil
, когда объект умирает, исключая возможность того, что делегирующий объект в конечном итоге отправит сообщения мертвому делегату.
Если по какой-то причине вы держитесь подальше от ARC, по крайней мере измените свойства assign
, указывающие на объекты, на unsafe_unretained
, которые явно указывают на то, что это необслуживаемая, но ненулевая ссылка на объект.
assign
остается подходящим для необъектных значений как в ARC, так и в MRC.