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:
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:
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 .
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
- @IBAction func loadImages(sender: Any?) {
- let panel = NSOpenPanel()
- panel.allowsMultipleSelection = true
- panel.allowedFileTypes = [kUTTypeImage as String]
- let result = panel.runModal()
- if (result.rawValue == NSFileHandlingPanelOKButton) {
- for url in panel.urls {
- var image = CIImage(contentsOf: url)
- print(image?.extent.width)
- }
- }
- }
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
- @IBAction func loadImages(sender: Any?) {
- let panel = NSOpenPanel()
- panel.allowsMultipleSelection = true
- panel.allowedFileTypes = [kUTTypeImage as String]
- let result = panel.runModal()
- if (result.rawValue == NSFileHandlingPanelOKButton) {
- for url in panel.urls {
- autoreleasepool {
- var image = CIImage(contentsOf: url)
- print(image?.extent.width)
- }
- }
- }
- }
Kann mir vielleicht einer von euch helfen und sagen, was hier schief läuft? Ich bin mittlerweile doch überfragt .