Память При использовании tabBarController

swift

#1

Такой вопрос, как происходит освобождение памяти при использование TabBarControllera, Получается когда я перехожу по всем пунктам бара, все контроллеры загружаются в память, а когда происходит очистка, и можно ли этим как-то управлять!

Сразу же к этому вопрос, я сейчас использую singleton при работе с firebase, есть несколько аккаунтов, должен ли при выходе из одного аккаунта уничтожаться объект синглтона или он живет всю сессию приложения!? Я вроде все проверил на циклические ссылки, нигде не должно быть утечек

Спасибо!


#2

Никак, контроллеры загружаются при первом переходе и больше не выгружаются пока жив UITabBarController. При переключении у контроллеров вызываются viewWillAppear/viewDidAppear и viewWillDisappear/viewDidDisappear.

Как правило да, именно такое поведение от него ожидают.


#3

Может тогда сможете подсказать, я в синглетоне в firebase использую observe(.childAdded), он используется при viewDidLoad в контроллере что в табаре, потом я делаю логаут, все контролеры таб бара уничтожаются, я логинюсь и снова вызывается метод observe(.childAdded) и получается что теперь при добавление одного элемента в child он реагирует два раза, я надеюсь понятно объяснил проблему!


#4

Detach listeners
Observers don’t automatically stop syncing data when you leave a ViewController. If an observer isn’t properly removed, it continues to sync data to local memory. When an observer is no longer needed, remove it by passing the associated FIRDatabaseHandle to the removeObserverWithHandle method.

When you add a callback block to a reference, a FIRDatabaseHandle is returned. These handles can be used to remove the callback block.

If multiple listeners have been added to a database reference, each listener is called when an event is raised. In order to stop syncing data at that location, you must remove all observers at a location by calling the removeAllObservers method.

Calling removeObserverWithHandle or removeAllObservers on a listener does not automatically remove listeners registered on its child nodes; you must also keep track of those references or handles to remove them.


#5

Я правильно понимаю, что мне нужно для каждого child вызывать removeAllObservers, нельзя вызвать этот метод просто для parent


#6

Тут же все написано, за чайлдами нужно так же следить вам.
Можете к примеру так же сделать синглетон, который будет собирать все ссылки на чайлдов и будет метод, в котором они все будут удаляться.
Упрощенный пример:

signleton FIR... {
    let childsReferences: [ChildRefType] = []

    fun addChild(child: ChildRefType) {
         childsReferences.add(child)
    }

    fun removeAllReferences() {
         childsReferences.forEach { $0.remove/detach } // или что там нужно вызывать
    }
}

#7

Спасибо!)
Все сделал!)))