Подтвердить что ты не робот

Свойство "назначить" и "сохранить" для делегата

Для разработчиков iOS делегаты используются почти везде.

И похоже, что нам нужно использовать "присваивать" вместо сохранения для такого делегата

@property(assign) id delegate;

Причина заключается в том, чтобы избежать проблемы с циклическим циклом Почему делегатам Objective-C обычно присваивается присваивание свойства вместо сохранения?

Я видел много кода, и они все еще использовали "сохранить". Итак, вопрос в том, будет ли мы по-прежнему получать круглый цикл, если мы будем использовать сохранение для делегата?

Спасибо

4b9b3361

Ответ 1

documentation говорит:

Сохранение объекта создает сильную ссылку, и объект не может быть освобожден до тех пор, пока не будут освобождены все его сильные ссылки. Если два объекта сохраняют друг друга, ни один объект никогда не освобождается, потому что соединение между ними невозможно сломать.

В качестве примера рассмотрим UITableViewController, который реализует протокол UITableViewDelegate. UITableView удерживается контроллером просмотра, хотя UITableView не сохраняет его делегатом.

Как сказано выше в документе, UITableViewController только завершит свое освобождение, когда все его сильные ссылки будут выпущены. Поскольку UITableView, который имеет UItableViewController в качестве делегата, не сохраняет его, когда владелец UItableViewController вызывает его освобождение, счетчик сохранения будет равен нулю, и метод dealloc будет вызван.

Теперь представьте, что UITableView сохраняет свой делегат. UITableViewController будет иметь счетчик не менее +2. Один с ним владелец, а другой с UITableView. Когда владелец UITableViewController вызывает на нем освобождение, счетчик сохранения будет равен +1, а не нулю, как и ожидалось, и поэтому метод dealloc не будет вызван до тех пор, пока счет сохранения не достигнет нуля. Чтобы достичь нуля, UITableViewController должен будет выпустить свой UITableView, который затем выпустит его делегат (UITableViewController). Поскольку UITableViewController будет располагать свой вид (UITableView), когда освобождение этого момента никогда не произойдет, потому что счет сохранения не будет ниже +1.

(не будем принимать во внимание предупреждения о памяти и любые другие возможные случаи... Я просто видел, что ViewController/View не самый лучший вариант для этого примера, но я уже написал слишком много.:))

Это имеет смысл?