2015-11-11 10 views
9

verursacht Wenn ich [weak self] auf einem Verschluss und Referenz self als self? innerhalb UIView.animateWithDuration die App zum Absturz zu erklären:Verweise auf [schwaches Selbst] als Selbst? innerhalb animateWithDuration Absturz

someFunc() { [weak self] (success) -> Void in 
    UIView.animateWithDuration(0.25) { 
     self?.someView.alpha = 1; 
    } 
} 

mit einem message sent to deallocated instance

aber wenn ich vor unwrap selbst optional Zeit es doesn 't

Warum ist das, ich würde denken, dass es egal ist, auf welche Weise ich die schwache se referenziere lf da es "nur" optional self? korrekt auspacken soll. Für Kontext wird dies in einem UICellView getan, die freigegeben wird, wenn ich die UICollectionViewController

EDIT verlassen: einen Fehler mit Apfel abgelegt: # 23492648

+0

Das ist eigentlich wirklich komisch, riecht nach einem Fehler für mich. Was ist los mit dem unnötigen ';'? Rufen Sie eine Funktion an oder ist das eine Eigenschaft? – Kametrixom

+1

Danke, dass ich das herausgebracht habe, ich habe es für Klarheit geklärt, anstatt 'doSomething'. Ich habe für die Verwendung von ';' in unserer Codebasis gedrängt, weil es das Ende von Anweisungen eindeutig macht. Es gibt Situationen, in denen Sie eine Anweisung haben könnten, die eine Zeile umschließt, und das ist nicht sehr offensichtlich :) – Shizam

+0

Dies ist ein guter Fehlerbericht und Sie sollten ihn an Apple melden. Aber es ist auch wahr, dass du immer den schwach-starken Tanz machen solltest, wenn du Dinge schwach in eine anonyme Funktion überträgst, wie du es im zweiten Beispiel tust ("wenn du dich selbst schwächen lässt"), also tu es einfach und gehe weiter. – matt

Antwort

3

Ich denke, das Problem hier ist, dass self Besonderes ist. Sie haben den Verweis auf self schwach in die anonyme Funktion übergeben, um einen Retain-Zyklus zu verhindern, aber in dieser Geschichte gibt es nicht wirklich eine optionale Umhüllung self. So ist der syntaktische Zucker self?.someView.alpha = 1 - und denken Sie daran, es ist nur syntaktischer Zucker - funktioniert nicht.

Es kann sein, dass Apple dies als einen Fehler betrachten wird; oder vielleicht nicht. Wie auch immer, die Lösung besteht darin, genau das zu tun, was Sie im zweiten Beispiel tun: Machen Sie den schwach-starken Tanz explizit.

Verwandte Themen