2016-04-28 17 views
7

W mojej aplikacji tworzę nowe kontrolery widoku, zamiast korzystać z segues, ponieważ dzięki temu wygląda lepiej w animacjach, moje widoki działają w tle. Powoduje to duże wycieki pamięci.Usuwanie kontrolera widoku z pamięci podczas tworzenia nowego kontrolera widoku

Mój kod, aby wrócić do głównego ekranu:

let mainStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
     let vc : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainScreen") as UIViewController 
     self.presentViewController(vc, animated: false, completion: nil) 

Pogląd ten kontroler jest nadal aktywna w tle, a zatem nie powinny być ponownie instancja. Jak mam to zrobic.

Po zamknięciu kontrolera widoku przy użyciu powyższego kodu również go nie rozładuję, działa on nadal w tle. Jak mogę go zwolnić, gdy zniknie ekran.

Próbowałem robić

override func viewDidDisappear(animated: Bool) { 
    super.viewDidDisappear(animated) 
    view.removeFromSuperview() 
    view = nil 
} 

Jednak to nie działa prawidłowo. W jaki sposób poprawnie zniszczyć kontroler widoku z pamięci podczas wychodzenia z kontrolera widoku w ten sposób.

+1

Ty możliwe, nie usunie kontrolera widoku z jego wnętrza (tj. viewDidDisappear) - musisz usunąć wszystkie odwołania do niego, w którym to momencie 'ARC' zwolni to. Jeśli jedynym miejscem, do którego się odwołujesz, jest to, kiedy utworzysz go powyżej, to po prostu wywołanie polecenia 'dismissViewController' na tym, co je przedstawiło, pozwoli na zwolnienie kontrolera viewcontroller. – Adam

Odpowiedz

8

tylko trzeba użyć:

self.dismissViewControllerAnimated(true, completion: {}) 

Reszta pracy robi przez ARC

Aby pomóc Państwu w trakcie debugowania można dodać również ten kod:

if let app = UIApplication.sharedApplication().delegate as? AppDelegate, let window = app.window { 
    if let viewControllers = window.rootViewController?.childViewControllers { 
     for viewController in viewController 
      print(viewController.debugDescription) 
     } 
    } 
} 
+0

Gdzie dokładnie powinienem umieścić dismissViewControllerAnimated()? Czy powinienem umieścić go w kontroler widoku, że zamykam? To chyba nie działa. Nie sprowadza mnie z powrotem do nowego kontrolera View –

+1

Na przykład w metodzie dotknięcia przycisku .. –

+1

Zrób przycisk w swoim viewController, nazwij to DISMISS, połącz ibaction dla touchupinside i wstaw w tej metodzie linię odrzuceń –

Powiązane problemy