Hallo zusammen,
ich bin gerade dabei mein Programm zu optimieren und schau mir dabei auch den Speicherverbrauch an. Dabei ist mir folgendes aufgefallen:
Die Konfigurationseinstellungen meines Programms werden in einem separatem Fenster dargestellt. Dieses Fenster als auch der dazugehörige ViewController wird zur Laufzeit erzeugt. Damit die Ressourcen nicht gleich zu beginn verwendet werden, habe ich dies mittels Lazy-Variablen gelöst:
Alles anzeigen
Das Fenster selbst wird relativ simpel eingeblendet:
Wenn nun das Konfigurationsfenster aufgerufen wird steigt der Speicherverbrauch der Anwendung um ca. 150 MB an (es handelt sich um eine umfangreiche Konfiguration - u.a. mit TableViews, etc. - also sollte soweit passen). "Release when closed" im Storyboard ist gesetzt. Allerdings bleibt der Speicher belegt selbst wenn das Fenster wieder geschlossen wurde.
Beim suchen nach der Ursache bin ich u.a. auf folgende Info gestoßen:
Meine Frage nun: wie kann ich sicherstellen, dass beim schließen eines Fensters einer Anwendung auch die dafür verwendeten Ressourcen wieder freigegeben werden (zumindest bis das Fenster - in meinem Fall der Konfigurationsdialog - wieder benötigt wird)?
Falls jemand eine Idee oder Tipp hat würde ich mich über eine Antwort freuen
ich bin gerade dabei mein Programm zu optimieren und schau mir dabei auch den Speicherverbrauch an. Dabei ist mir folgendes aufgefallen:
Die Konfigurationseinstellungen meines Programms werden in einem separatem Fenster dargestellt. Dieses Fenster als auch der dazugehörige ViewController wird zur Laufzeit erzeugt. Damit die Ressourcen nicht gleich zu beginn verwendet werden, habe ich dies mittels Lazy-Variablen gelöst:
Quellcode
- // MARK: - Konfiguration / Daten
- lazy var viewController_Config: ConfigViewController? =
- {
- let Storyboard : NSStoryboard? = NSStoryboard(name: NSStoryboard.Name("Config"), bundle: nil)
- var ConfigViewController = Storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("ConfigViewController")) as! ConfigViewController?
- return ConfigViewController
- }()
- lazy var windowController_Config: ConfigWindowController? =
- {
- let Storyboard: NSStoryboard? = NSStoryboard(name: NSStoryboard.Name("Config"), bundle: nil)
- var ConfigWindowController = Storyboard?.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("ConfigWindowController")) as! ConfigWindowController?
- ConfigWindowController?.contentViewController = viewController_Config
- // Initialized-Variable setzen
- windowControllerConfigInitialized = true
- return ConfigWindowController
- }()
Das Fenster selbst wird relativ simpel eingeblendet:
Wenn nun das Konfigurationsfenster aufgerufen wird steigt der Speicherverbrauch der Anwendung um ca. 150 MB an (es handelt sich um eine umfangreiche Konfiguration - u.a. mit TableViews, etc. - also sollte soweit passen). "Release when closed" im Storyboard ist gesetzt. Allerdings bleibt der Speicher belegt selbst wenn das Fenster wieder geschlossen wurde.
Beim suchen nach der Ursache bin ich u.a. auf folgende Info gestoßen:
Anschließend habe ich versucht mittels CFGetRetainCount(windowManager.windowController_Config?.window) den Referenzzähler zu ermitteln. Dieser geht selbst beim schließen des Fensters nicht auf 0 (bleibt konstant bei 2).stackoverflow schrieb:
When you're using a window controller, you do not release the window itself. The window controller owns it and it will release it when it's done with it. Likewise, releaseWhenClosed is ignored for windows owned by window controllers.
Meine Frage nun: wie kann ich sicherstellen, dass beim schließen eines Fensters einer Anwendung auch die dafür verwendeten Ressourcen wieder freigegeben werden (zumindest bis das Fenster - in meinem Fall der Konfigurationsdialog - wieder benötigt wird)?
Falls jemand eine Idee oder Tipp hat würde ich mich über eine Antwort freuen