2015-12-23 2 views
6

Ich erlebe diesen seltsamen Absturz beim Erfassen einer Instanz einer @objc-Klasse (geschrieben in swift, aber mit @objc und einer Unterklasse von NSObject). Dies passiert, wenn die Schließung zugewiesen wird und nicht wenn sie aufgerufen wird. Das Problem ist also nicht, dass der erfasste Wert aufgehoben wird und dann die Schließung aufgerufen wird. Es passiert zufällig, manchmal stürzt es früher ab, manchmal später. Ich hatte diesen Fehler in früheren Versionen von Swift (ich glaube es war Swift 1.2), aber jetzt benutze ich 2.1 und bekomme auch diesen Absturz._swift_abortRetainWurde beim Erfassen der @objc-Klasse als unowned aufgerufen

Es funktioniert gut, wenn ich [unowned x]-[weak x] ändern und es dann mit Gewalt Zugang x!.doSomething() auspackt, die mich es ist ein Fehler in Swift führt zu glauben, anstatt in meinem Code. Bevor ich jedoch ein Ticket bei bugs.swift.org eröffnen wollte, wollte ich mehr darüber erfahren, um sicherzugehen, dass ich nichts verpasse.

Es ist auch hier erwähnt:
http://www.codeproject.com/Articles/791304/Resolving-strong-references-between-Swift-and-Obje
hier:
https://www.reddit.com/r/swift/comments/3vhwmj/unowned_bug_in_closure_causes_attempted_to_retain/
und hier:
https://forums.developer.apple.com/thread/9873

Aber anders als die Aufnahme zu weak und Kraft zu ändern es später auszupacken, gibt es keine Lösung .

+0

Haben Sie alle gefunden, was die Ursache war und warum es nicht funktioniert, wenn unowned mit innerhalb einer Aufnahmeliste? – Whirlwind

+0

Nein, habe ich nicht, ich musste alle [unowned x] zu [weak x] ändern, um diese Abstürze loszuwerden. –

Antwort

2

Normalerweise ziehe ich diesen Code zu verwenden, anstatt unowned wenn ich mit einigen enthalten objc Klassen zu tun haben:

[weak self] in 
guard let strongSelf = self else { return } 
// use strongSelf below 
Verwandte Themen