2017-08-22 3 views
0

Ich habe eine App mit 3 Viewcontrollern, die auf einen Navigationscontroller-Stack geschoben werden.NotificationCenter: BAD_ACCESS wenn Benachrichtigung postet

(A) -> (B) -> (C)

(A) Register für Benachrichtigungen in viewWillAppear:

NotificationCenter.default.addObserver(self, selector: #selector(reload), name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

und (A) austrägt in viewWillDisappear:

NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

Zusätzlich (A) abmeldet in deinit() aber nie aufgerufen.

Jetzt (B) wird auf Stapel geschoben und registriert/Abmelden für das gleiche Ereignis wie (A).

Jetzt wird (C) auf Stapel geschoben, der eine Berechnung auslöst und wieder auf (B) zurückspringt. Einige Zeit später, während (B) wird die Berechnung dargestellt ist abgeschlossen und eine Meldung wird ausgelöst:

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DATA_CHANGED"), object: nil) 

Aber dies führt zu einer

Gewinde 1: EXC_BAD_ACCESS

Ich bin sicher, dass Die Benachrichtigung ist das Problem, weil ich den Namen der Benachrichtigung falsch geschrieben habe und dann kein Absturz aufgetreten ist. Auch (A) und (B) sind immer noch nicht freigegeben, da sie auf dem Stapel leben. Ich konnte im Profiler keinen Zombie finden.

Irgendeine Idee, was könnte das Problem sein?

Ich bin mit XCode 9beta6 und Swift 4.

+1

Bitte bearbeiten Sie Ihre Frage, um den Stack-Trace anzuzeigen. – Paulw11

+0

Es gibt keine Stack-Trace. Ich bekomme EXC_BAD_ACCESS nur als rote Linie. – netshark1000

+1

Legen Sie den Ausnahmeblockpunkt fest, um die betroffene Zeile, den tatsächlichen Ausnahmegrund und den Stack-Trace abzurufen. Höchstwahrscheinlich ist die Signatur des Selektors falsch. – vadian

Antwort

0

Also habe ich gerade 4 Stunden damit verbracht, dies in meinem eigenen Code zu beheben. Hier ist, was mein Problem war:

Die Funktion, die ich in meinem Selektor angegeben hatte, hatte einen optionalen Parameter mit einem Standardwert von Null. Mein Selektor sah dann genauso aus wie deiner - keine Parameterliste. Als ich jedoch eine Benachrichtigung ausgelöst habe, erhielt ich EXC_BAD_ACCESS.

Ich habe versucht, die Funktion eines Elternteils mit meinem Selektor in Bezug auf die Kindklasse aufzurufen, in der ich die Benachrichtigung registriert habe. Ich musste eine Hilfsfunktion für die Kindklasse machen und die Elternfunktion aufrufen.

Wenn Sie einen optionalen Parameter in reload haben und/oder reload ist eine Funktion in einer übergeordneten Klasse, versuchen Sie, eine Hilfsfunktion, die Aufladung aufrufen und Ihren Auswahlpunkt darauf hinweisen.

1

Sie registrieren Anmeldung mit dem Namen „BACKEND_DATA_CHANGED“ und Deregistrierung „DATA_CHANGED“ .Sie sind verschiedene Meldungen.

+0

sorry - ich habe das Beispiel vereinfacht und dort einen Fehler gemacht. Jetzt ist es korrekt – netshark1000

+0

Erhalten Sie denselben Fehler, selbst wenn die Namen korrekt sind? –

Verwandte Themen