быстрый метод deinit не вызывает - PullRequest
0 голосов
/ 09 мая 2019

In UIViewController deinit метод, не вызывающий в ios swift4.2

Я попробовал приведенный ниже код для перехода к следующему viewController после навигации в popToViewcontroller deinit метод не вызывается.

 let data = isSearchEnabled ? repository.filteredList[index] : repository.list[index]
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    (appDelegate.window?.rootViewController as! UITabBarController).tabBar.isHidden = true
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let viewController = storyboard.instantiateViewController(withIdentifier: "AuctionDetailsViewController") as! AuctionDetailsViewController
    viewController.auction = data.getAuctionData()
    viewController.parentVC = self
    parentNavigationController?.pushViewController(viewController, animated: true)

PushView:

deinit {
    print("AuctionDetailsViewController deallocated...")
}

Вышеупомянутый deinit метод должен быть вызван на popToViewcontroller

1 Ответ

0 голосов
/ 09 мая 2019

Вам необходимо знать об управлении памятью, осуществляемом iOS с использованием ARC.Вы можете прочитать это здесь

Deinit () не вызывается, если viewcontoller ...

удерживает сильноессылка на объект (сохранить цикл)

вам необходимо проверить и удалить ненужные сильные ссылки на объект, чтобы избежать розничного цикла

имеетнаблюдатель уведомления

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

использование делегатов (сохраняйте сильную ссылку на него)

, если контроллер представления подтверждает протокол, что делегат должен быть помечен как weak.

Выше были упомянуты некоторые моменты, которые не позволяют контроллеру вида освободить и deinit никогда не вызывается.Могут быть и другие причины, объясняющие то же самое.

...