Обработка слабой ссылки на цель / действие с помощью NSOperation - PullRequest
1 голос
/ 01 июня 2011

Я использую NSOperation для обработки фоновой обработки в приложении для iOS и пытаюсь понять шаблон цели / действия. В шаблоне делегата делегат удерживается как слабая ссылка, и объект делегата отвечает за установку поля делегата другого объекта равным nil до его dealloc s. В шаблоне «цель / действие», насколько я понимаю, цель считается слабой ссылкой по аналогичным причинам. Тем не менее, не так просто "nil вывести" целевое поле, когда целевой объект dealloc s, а при NSOperation s существует вероятность того, что операция все еще может находиться в очереди, когда ее целевой объект освобожден.

Как в этом случае следует обращаться с управлением памятью (если NSOperation выполняет фоновую обработку, а затем использует цель / действие для возврата значения создателю NSOperation)?

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Как объяснено в Цель , вы должны убедиться, что цель доступна, если элемент управления может отправить действие.На практике это не проблема, поскольку целью, как правило, является контроллер, созданный до и освобожденный после элементов управления.

Если вы отправляете сообщения действия из операции, вам необходимо убедиться, чтоцель не освобождается, пока операция не завершится.Одним из способов сделать это может быть сохранение цели до тех пор, пока операция не будет завершена.

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

0 голосов
/ 28 ноября 2017

UIControl использует слабую ссылку на цель, поэтому методы действия цели не изменяют время жизни цели.

NSTimer принимает __ сильную ссылку на цели, цели не будут освобождены до тех пор, пока объект NSTimer не освободится. Это может привести к сохранению круга.

Попробуйте этот пакет: https://github.com/Elenionl/ELAutoSelector

...