2016-10-30 4 views
1

Я после последней конференции Apple, о НОД по этой ссылке: https://developer.apple.com/videos/play/wwdc2016-720/?time=33 я добрался до места, где он говорит о предпосылке здесь: https://developer.apple.com/videos/play/wwdc2016-720/?time=1267, новая функция в Swift 3. Прибыл в данный момент : https://developer.apple.com/videos/play/wwdc2016-720/?time=1474 используется: .register (observer :, queue :) enter image description here мой вопрос: как эта функция сохраняет объект BusyController? https://developer.apple.com/videos/play/wwdc2016/720/?time=1550Предпосылкой Swift 3

ответ

0

Вы спрашиваете, как это register(observer:queue:) сохраняет BusyController.

Во-первых, давайте вернемся к этому вопросу: не будем заблуждаться в деталях его примера. Он не говорит, что это будет установить сильную ссылку, просто чтобы она могла, и поэтому вы должны быть осторожны, просто пытаясь очистить в deinit.

Итак, как можно DataTransform сохранить BusyController? Он просто мог бы поддерживать сильную ссылку на его observer. Обратите внимание, что не приравнивать этот метод пользовательских register примера со стандартными методами наблюдателей: Они просто говорят «представить себе, что DataTransform объекта создал сильную ссылку на BusyController ...»

Но, как он продолжает говорить " но вы опытные разработчики, и вы знаете, как исправить эту проблему, используйте ссылку weak ». Поэтому, как правило, мы не будем писать методы наблюдения, которые поддерживали бы надежные ссылки на их наблюдателей.

Но, как он далее говорит, даже если вы хорошо знаете, что избегаете сильных эталонных циклов, графический объект может стать довольно сложным, поэтому не всегда полезно полагаться на deinit для очистки. Он выступает за явный процесс invalidate и, возможно, использует предварительные условия для проверки того, что объект был аннулирован к моменту времени deinit.