CIImage leakt Speicher in Swift auf macOS

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CIImage leakt Speicher in Swift auf macOS

    Hallo zusammen,

    folgendes Problem raubt mir aktuell den Verstand, und ich wollte einmal hier im Forum fragen, ob ich hierbei einfach ganz grundsätzlich etwas zum Memory Management in Swift nicht verstehe, oder ob ich hier in ganz böses Spezialverhalten von CIImage unter Swift auf dem Mac reinlaufen.

    Folgende Situation: Ich habe eine App, die eine ganze Reihe an Bildern als CIImage lädt und diese verarbeitet. Ein ganz simpler Sample Code dazu beispielsweise hier:

    Quellcode

    1. @IBAction func loadImages(sender: Any?) {
    2. let panel = NSOpenPanel()
    3. panel.allowsMultipleSelection = true
    4. panel.allowedFileTypes = [kUTTypeImage as String]
    5. let result = panel.runModal()
    6. if (result.rawValue == NSFileHandlingPanelOKButton) {
    7. for url in panel.urls {
    8. var image = CIImage(contentsOf: url)
    9. print(image?.extent.width)
    10. }
    11. }
    12. }
    Alles anzeigen

    Wenn ich hiermit nun mehrere Bilder auswähle & lade, wächst die RAM-Nutzung meiner App bis hin zu mehreren hunderten MB rasant an, die auch bestehen bleiben, nachdem die Funktion durchlaufen ist. Es scheint mir so, als würden die CIImage Instanzen weiter erhalten bleiben, obwohl sie, so mein Verständnis, doch eigentlich nach Funtkionsablauf wieder aus dem Speicher geleert werden müssten.

    Auf Stackoverflow fand ich dann noch diese beiden Posts (Post1, Post2), die die Verwendung eines Autoreleaspools als Lösung vorschlugen. Gesagt, getan, auch dieser Code hier funktioniert so nicht:


    Quellcode

    1. @IBAction func loadImages(sender: Any?) {
    2. let panel = NSOpenPanel()
    3. panel.allowsMultipleSelection = true
    4. panel.allowedFileTypes = [kUTTypeImage as String]
    5. let result = panel.runModal()
    6. if (result.rawValue == NSFileHandlingPanelOKButton) {
    7. for url in panel.urls {
    8. autoreleasepool {
    9. var image = CIImage(contentsOf: url)
    10. print(image?.extent.width)
    11. }
    12. }
    13. }
    14. }
    Alles anzeigen
    Auch mit Autoreleasepools ist das Problem weiter vorhanden.

    Kann mir vielleicht einer von euch helfen und sagen, was hier schief läuft? Ich bin mittlerweile doch überfragt ?( ?( ?( .
  • @macmoonshine Ein Instruments Leak-Check run mit der App sieht so aus



    Was mich jetzt allerdings nur noch weiter verwirrt, wenn ich ehrlich bin. Diesem Instruments Run zufolge dürfte die App doch eigentlich gar nicht bei 300+ Mb dauerhafter RAM Belegung rauskommen... wieso ist das dann aber laut Xcode & Activity Monitor doch so.

    Falls ich hier komplette Basics übersehen sollte, wäre ein Hinweis in die richtige Richtung auch sehr willkommen!

    Danke schonmal, für diese erste Antwort auf jeden Fall :)