2017-01-20 1 views
1

Ich habe eine Ansicht contoller (für Login), die Deinit-Methode definiert, um Beobachter zu entfernen. Wenn der Benutzer auf die Schaltfläche Registrieren klickt, ruft der Controller performSegueWithIdentifier auf, um den Registrierungsansicht-Controller zu laden. Ich habe die Deinit-Methode definiert, um alle Beobachter zu entfernen. Diese Methode wird jedoch nicht aufgerufen. Ich habe es irgendwo gelesen, weil der Viewcontroller nicht zerstört wird und der Zeiger darauf irgendwo steht. Kann jemand den Grund dafür erklären?Erklärung für Deinit nicht genannt

Dank

EDIT: Obwohl ich damit einverstanden, dass der Link im Kommentarbereich hält die gleiche Frage zur Verfügung gestellt, es gibt keine auf diese Antwort oder klare Antwort. Die höchste Antwort mit der höchsten Antwort schlug vor, etwas innerhalb von Deinit zu definieren, anstatt es leer zu lassen. Das entspricht nicht der Suche, nach der ich suche. Aus diesem Grund behalte ich diese Frage, bis jemand darauf hinweist, dass mein Verständnis falsch ist. Und ich denke auch, dass Matt das kurz und klar erklärt.

+0

http://stackoverflow.com/a/33580360/1979882 – Vyacheslav

+1

Von Swift [Dokumentation] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html#//apple_ref/doc/uid/TP40014097-CH20-ID48): "... es ist möglich, Code zu schreiben, in dem eine Instanz einer Klasse _never_ zu einem Punkt kommt, an dem es keine starken Referenzen gibt. Dies kann bei zwei Klasseninstanzen passieren halte einen starken Bezug zueinander, so dass jede Instanz die andere am Leben erhält. Dies wird als starker Referenzzyklus bezeichnet. " – courteouselk

+1

Mögliche Duplikate von [Deinit hat nie angerufen] (http://stackoverflow.com/questions/26971415/deinit-never-called) – courteouselk

Antwort

6

Der übliche Grund dafür, dass deinit nicht ausgelöst wurde, wenn Sie erwartet werden, ist, dass Sie einen Retain-Zyklus haben, der verhindert, dass Ihr View-Controller auslöscht.

(Manchmal ist der Grund dafür, dass Ihre Erwartung, dass die View-Controller unter den gegebenen Umständen zerstört werden würde, ist falsch. Aber es ist unter der Annahme richtig ist, ein Zyklus behalten ist der Grund.)

Sie haben erwähnt, alle Beobachter zu entfernen. Welche Art von Beobachtern? Wenn wir über NSNotification sprechen, erhalten Sie oft einen Retain-Zyklus. Das Benachrichtigungscenter behält den Beobachter bei, bis Sie die Registrierung aufheben. Sie können also deinit nicht erhalten bis nach der Beobachter wurde entfernt. Daher können Sie den Observer indeinit nicht entfernen.

+0

Mein Buch beschreibt die ungewöhnliche Speicherverwaltung von Benachrichtigungen hier: http://www.apeth.com/ iOSBook/ch12.html # _unusual_memory_management_situations – matt

+0

Ja, es ist NSNotification und ich versuche diese Beobachter von Deinit zu entfernen. Also mein Problem ist .... Ich entferne Beobachter von Denint und Denint wird nur aufgerufen, wenn Beobachter entfernt werden. Danke für die ausführliche Erklärung und den Link auch! – user30646

Verwandte Themen