Это, несомненно, тот случай, когда ваши контроллеры представления не выпускаются. Возможно, у вас сильный справочный цикл.
Например, рассмотрим этот безобидный пример:
extension Notification.Name {
static let buzzer = Notification.Name(rawValue: Bundle.main.bundleIdentifier! + ".buzzer")
}
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(forName: .buzzer, object: nil, queue: .main) { _ in
self.foo()
}
}
func foo() { ... }
}
Если я затем войду и выйду из этого контроллера вида три раза, а затем нажму на кнопку «график отладочной памяти», я увижу следующее:
Я вижу три экземпляра моего второго контроллера вида на панели слева, и если бы они были должным образом освобождены, они бы там не появлялись. И когда я нажимаю на любой из них на этой панели, я вижу визуальный график того, что все еще имеет сильную ссылку на рассматриваемый контроллер представления.
В этом случае, поскольку я включил функцию «Malloc Stack» в «Product» »« Scheme »» «Edit Scheme ...» »« Run »» «Diagnostics» »« Logging », я вижу составить трассировку в самой правой панели и даже нажать кнопку со стрелкой и перейти к нарушающему коду:
В этом конкретном примере проблема заключалась в том, что я (намеренно, в иллюстративных целях) ввел постоянную сильную ссылку, где Центр уведомлений поддерживает строгую ссылку на self
, навязанную закрытием наблюдателя. Это легко исправить, используя шаблон [weak self]
в этом замыкании:
NotificationCenter.default.addObserver(forName: .buzzer, object: nil, queue: .main) { [weak self] _ in
self?.foo()
}
Теперь я не знаю, является ли это источником цикла строгих ссылок в вашем случае, потому что код в вашем фрагменте на самом деле не ссылается на self
. Возможно, вы упростили свой фрагмент кода, когда поделились им с нами. Может быть, у вас есть что-то еще, что хранит ссылку на ваши контроллеры представления.
Но с помощью этой кнопки «Диаграмма отладочной памяти» вы можете не только (а) подтвердить, что в памяти действительно есть несколько экземпляров вашего соответствующего контроллера представления; но также (б) определить, что установило эту сильную ссылку. Оттуда вы можете диагностировать причину проблемы. Но кода в вашем вопросе недостаточно, чтобы вызвать эту проблему, но я подозреваю, что где-то существует сильный цикл ссылок.