Skip to content

Commit f504ef9

Browse files
sdenikehuynguyenh
andcommitted
Fix comprehensive memory leaks (adapted from PR dwarvesf#335)
Adds the non-overlapping pieces of huynguyenh's PR dwarvesf#335 on top of rm335's PR dwarvesf#346. Handles the biggest leak source (NSLayoutConstraint retention when NSImageViews were recreated 9-10 times per toggle). - Deactivate NSLayoutConstraints before removing views in NSStackView.removeAllSubViews (prevents constraint retention of removed NSImageViews — primary leak source on macOS Sequoia/Tahoe) - Extend StatusBarController.deinit to invalidate timer and remove the always-hidden NSStatusItem - Change toggleStatusBarIfNeeded to only create the always-hidden status item when it doesn't already exist, instead of tearing down and recreating on every .alwayHideToggle notification Combined with the widest-display collapse-length calc in dwarvesf#354 and the bounded-length work in dwarvesf#344, this should resolve the runaway memory growth reported in upstream dwarvesf#326, dwarvesf#336, dwarvesf#351, dwarvesf#352. Co-Authored-By: huynguyenh <hoanghuy2908@gmail.com>
1 parent 8379f7f commit f504ef9

2 files changed

Lines changed: 16 additions & 11 deletions

File tree

hidden/Extensions/StackView+Extension.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Cocoa
1111
extension NSStackView {
1212
func removeAllSubViews() {
1313
for view in self.views {
14+
NSLayoutConstraint.deactivate(view.constraints)
1415
view.removeFromSuperview()
1516
}
1617
}

hidden/Features/StatusBar/StatusBarController.swift

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ class StatusBarController {
7777

7878
deinit {
7979
NotificationCenter.default.removeObserver(self)
80+
timer?.invalidate()
81+
timer = nil
82+
if let statusItem = self.btnAlwaysHidden {
83+
NSStatusBar.system.removeStatusItem(statusItem)
84+
}
8085
}
8186

8287
@objc private func handleScreenParametersChanged() {
@@ -269,20 +274,19 @@ extension StatusBarController {
269274
}
270275
@objc private func toggleStatusBarIfNeeded() {
271276
updateCollapsedLengths()
272-
277+
273278
if Preferences.alwaysHiddenSectionEnabled {
274-
if let existing = self.btnAlwaysHidden {
275-
NSStatusBar.system.removeStatusItem(existing)
276-
}
277-
self.btnAlwaysHidden = NSStatusBar.system.statusItem(withLength: btnAlwaysHiddenLength)
278-
if let button = btnAlwaysHidden?.button {
279-
button.image = self.imgIconLine
280-
button.appearsDisabled = true
279+
if self.btnAlwaysHidden == nil {
280+
self.btnAlwaysHidden = NSStatusBar.system.statusItem(withLength: btnAlwaysHiddenLength)
281+
if let button = btnAlwaysHidden?.button {
282+
button.image = self.imgIconLine
283+
button.appearsDisabled = true
284+
}
285+
self.btnAlwaysHidden?.autosaveName = "hiddenbar_terminate"
281286
}
282-
self.btnAlwaysHidden?.autosaveName = "hiddenbar_terminate"
283287
} else {
284-
if let existing = self.btnAlwaysHidden {
285-
NSStatusBar.system.removeStatusItem(existing)
288+
if let statusItem = self.btnAlwaysHidden {
289+
NSStatusBar.system.removeStatusItem(statusItem)
286290
}
287291
self.btnAlwaysHidden = nil
288292
}

0 commit comments

Comments
 (0)