То, что вы делаете, хорошо, но вам нужно что-то, чтобы удержать ваш экземпляр. delegate
свойства по традиции weak
, поэтому они не гарантируют сохранение объекта. Что-то еще должно сохранить это. Наиболее распространенным решением является добавление свойства к классу, которому принадлежит someView
, и присвоение этому свойству MapViewAnnotationDelegate
перед назначением его в качестве делегата. Таким образом, он не будет освобожден, пока живет содержащийся объект. Но все, что сохраняет это в порядке
Ваш текущий код в настоящее время делает это:
- Создать MapViewAnnotationDelegate
- Назначьте его someView.delegate
- Обратите внимание, что нет сильных ссылок на MapViewAnnotationDelegate (поскольку someView.delegate является слабой ссылкой)
- Уничтожить MapViewAnnotationDelegate
- Установить someView.delegate на ноль
С одной стороны, это может выглядеть так:
class Owner {
let mapViewAnnotationDelegate = MapViewAnnotationDelegate()
let someView: ...
init() {
someView.delegate = mapViewAnnotationDelegate
}
}
В этой конфигурации Owner
(который является владельцем someView
) удерживает делегата в течение его времени жизни.