2014-11-16 7 views
9

Ich benutze eine UISplitViewController jedes Mal, wenn ich auf eine Zeile in der Master-VC klicken Ich kann sehen, dass viewDidLoad() im Detail VC ausgeführt wird.iOS: Wie überprüft man, ob UIViewControllers entladen? (Swift)

Bedeutet das, ich erstelle eine neue Instanz von Detail VC jede Zeile klicken?

Wenn ja, wie kann ich überprüfen, dass die Detail-VC korrekt entladen wird und ich nicht nur immer mehr neue Detail-VCs erstelle?

Ich bin ein bisschen hier in Swift verloren. Früher konnte ich dealloc() NSLoggen und die UIViewController korrekt entladen sehen.

ich hier Swift hat eine deinit Funktion aber nie aufgerufen:

deinit { 
    println("\(__FILE__.lastPathComponent)) : \(__FUNCTION__)") 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

1) Wo soll ich meine Beobachter werden zu entfernen?

2) Wenn ich im Debug-Navigator in Xcode nachschaue, steigt die Speicherbelegung immer weiter und nie ab.

Aktualisiert: Detail VC aufgerufen wird, wie folgt:

if segue.identifier == "addEvent" { 
    if let controller = (segue.destinationViewController as UINavigationController).topViewController as? ManageViewController { 
     controller.manageEvent = nil 
     controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
     controller.navigationItem.leftItemsSupplementBackButton = true 
    } 
} 

Ich bin anders als viele Beispiele nicht etwas zu tun, die ich je gesehen habe, aber ich mache mir Sorgen um deinit nicht

genannt werden Aktualisiert: Arbeiten jetzt - Problem war mit Delegierten stoppen deinit genannt wird (unten Antwort sehen)

Mein ursprünglicher Non-Working-Code war:

protocol ManageViewDelegate { 
    func pressedButton(sender: AnyObject) 
} 

class ManageView: UIView { 
    var delegate: ManageViewDelegate? = nil 
    ... 
} 

Neue Arbeitscode:

protocol ManageViewDelegate: class { 
    func pressedButton(sender: AnyObject) 
} 

class ManageView: UIView { 
    weak var delegate: ManageViewDelegate? = nil 
    ... 
} 
+1

funktionieren sollte, wenn 'deinit' nicht ist genannt werden, bedeutet, dass die Erinnerung von * etwas * erhalten wird und nicht freigegeben wird. Sie sollten Ihre Frage bearbeiten, um zu zeigen, wie Sie beim Klicken auf jede Zeile auf Detailansicht-Controller wechseln. –

+0

Aktualisiert, und wie markieren Sie bestimmte Wörter wie Sie mit Deinit? – Richard

+1

Sie werden bald lernen, wie man die "Markup" -Funktionen von StackOverflow nutzt (http://stackoverflow.com/editing-help). –

Antwort

24

Sie haben eine Ansicht mit einer delegate Eigenschaft, die zurück in die View-Controller verweist. Dies führt zu einem starken Referenzzyklus (zuvor bekannt als Retain-Zyklus), da der View-Controller eine starke Referenz zu seiner Top-Level-Ansicht beibehält, die wiederum eine starke Referenz zu dem View-Controller aufrechterhält.

In den Resolving Starke Referenz Zyklen zwischen den Klasseninstanzen Abschnitt The Swift Programming Language: Automatic Reference Counting beschreibt Apple-how an dieser Adresse:

Swift bietet zwei Möglichkeiten stark Referenzzyklen zu lösen, wenn Sie mit Eigenschaften von Klassentyp arbeiten: schwache Referenzen und unbenannte Referenzen.

Schwache und nicht gespeicherte Referenzen ermöglichen es einer Instanz in einem Referenzzyklus, auf die andere Instanz zu verweisen, ohne sie fest zu halten. Die Instanzen können sich dann aufeinander beziehen, ohne einen starken Referenzzyklus zu erzeugen.

Verwenden Sie eine weak Referenz, wann immer es gültig ist, dass diese Referenz zu irgendeinem Zeitpunkt während ihrer Lebensdauer nil wird. Verwenden Sie umgekehrt eine Referenz unowned, wenn Sie wissen, dass die Referenz nie nil wird, sobald sie während der Initialisierung festgelegt wurde.

So können Sie Ihre starken Referenzzyklus beheben, indem die delegate definieren weak sein:

weak var delegate: ManageViewDelegate? 

Damit das funktioniert, müssen Sie das verwendete Protokoll geben ein Klasse-Protokoll zu sein:

protocol ManageViewDelegate: class { 
    // your protocol here 
} 

Das löst den starken Referenzzyklus und eliminiert die Notwendigkeit, nildelegate manuell zu lösen, um den starken Referenzzyklus aufzulösen e.

0

Auch wenn Sie Blöcke verwenden müssen Sie [schwachen Selbst], sonst hinzufügen, würde die Ansicht nicht

zerstört werden
setupObserve(postID) { 
     [weak self] chatRequest in 
    self?.update() 
} 

Die deinit Funktion

Verwandte Themen