Ich entwickle eine Anwendung in Swift 2 (Xcode 7 Beta 3) und ich versuche, Werttypen (Structs und Enums) wo möglich zu verwenden. Laut der Dokumentation von Apple über Speicherverwaltung sollte das Arbeiten mit Werttypen keine Aufbewahrungszyklen verursachen und es sollte einfach funktionieren.Speicherleck in Swift-Strukturen - Wie behebt man das?
Aber heute habe ich eine große Menge an Speicherlecks in Ereignisbehandlungscode festgestellt. Ich habe es aufgespürt und das Problem auf das folgende minimale Beispiel reduziert.
Lasst uns sagen, dass es ein Protokoll Item
ist die value
eine einzige Eigenschaft definiert:
protocol Item {
var value: String { get }
}
Wir haben dann eine konkrete Struktur schaffen, die das Item
-Protokoll implementiert und fügt eine zusätzliche Eigenschaft additionalValue
. Nennen wir die Struktur FooItem
.
struct FooItem<T>: Item {
let value: String
let additionalValue: T
init(value: String, additionalValue: T) {
self.value = value
self.additionalValue = additionalValue
}
}
Das dritte Stück des Puzzles ist eine andere Struktur, die ein Element der Umsetzung des Item
Protokoll wickelt. Es heißt ItemWrapper
.
struct ItemWrapper {
let item: Item
init(item: Item) {
self.item = item
}
}
Wenn in Instruments profiliert erscheint der Memory-Leaks-Konfiguration verwendet wird, kann ein Speicherverlust jedes Mal ein ItemWrapper
Wert mit einem FooItem
erstellt wird.
let item = FooItem(value: "protocol value", additionalValue: "foo item value")
let _ = ItemWrapper(item: item)
Hier ist das Beispiel Xcode Projekt und die Instruments Datei: https://www.dropbox.com/s/z6ugxzxqggrv1xl/SwiftStructsMemoryLeak.zip?dl=0
Das ganze Codebeispiel kann in diesem Gist eingesehen werden: https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a
Hier ist der Fehlerbericht: rdar: // 21375421
Ist es ein Fehler im Swift-Compiler oder mache ich etwas falsch?
EDIT 1: Wie in den Kommentaren vorgeschlagen, reposted ich diese Frage auf das Apple-Dev Forum, um mehr Aufmerksamkeit von der Swift-Community zu ziehen und möglicherweise von den Entwicklern der Sprache. Aufgrund einer Migration der Dev-Foren während der WWDC 2015 musste ich eine aktualisierte Frage zu den neuen Foren stellen. Hier ist der Link: https://forums.developer.apple.com/message/9643
EDIT 2: Das Problem, das ich ursprünglich im Beispielcode geschrieben scheint in Swift 2.0 gelöst werden. Da es die Probleme in meiner App nicht gelöst hat, habe ich eine weitere Änderung am Beispielcode vorgenommen. Jetzt hat die zusätzliche Eigenschaft FooItem
einen generischen Typ und FooItem
wird mit dem Typ und somit einem generischen Typ kommentiert. Dies ist, wie ich es in meiner App verwende und es immer noch einen Speicherverlust verursacht, aber dieses Mal, wenn die ItemWrapper
initialisiert wird und nicht beim Zugriff auf die Eigenschaft.
EDIT 3: Voll die Frage an das modifizierte Problem aktualisiert, die 2.0 in Swift weiterhin besteht und neues Beispiel Xcode Projekt hochgeladen.
Was meinen Sie an anderer Stelle durch - im Code oder für weitere Ressourcen zum Thema auf anderen Websites? –
Das Beispiel ist eigentlich nur diese 3 Entitäten und der Code, der sie aufruft. Sieh dieses Gist https://gist.github.com/lukaskubanek/4e3f7657864103d79e3a für das ganze AppDelegate. Entschuldige, dass ich es in der Frage nicht erwähnt habe. –
Ich konnte das Problem reproduzieren, aber keine Ahnung, was zur Hölle los ist .. +1 – Mazyod