From 5278441547284ecc0bb064ee265cbd5525bb8da0 Mon Sep 17 00:00:00 2001 From: Xiaopeng Li Date: Mon, 8 May 2023 22:58:34 +0800 Subject: [PATCH] Fix device description leak (#2758) * Fix device description leak * Update CHANGELOG.md --------- Co-authored-by: Xiaopeng Li --- CHANGELOG.md | 1 + src/platform_impl/macos/appkit/screen.rs | 30 ++++++++++++++---------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb034ac5df..4e93b23da9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On macOS, fix empty marked text blocking regular input. - On macOS, fixed potential panic when getting refresh rate. - On macOS, fix crash when calling `Window::set_ime_position` from another thread. +- On macOS, fixed memory leak when getting monitor handle. # 0.28.3 diff --git a/src/platform_impl/macos/appkit/screen.rs b/src/platform_impl/macos/appkit/screen.rs index 9b76ecbbb2..7eb8b2a751 100644 --- a/src/platform_impl/macos/appkit/screen.rs +++ b/src/platform_impl/macos/appkit/screen.rs @@ -39,21 +39,25 @@ extern_methods!( } pub fn display_id(&self) -> u32 { - let device_description = self.deviceDescription(); + let key = ns_string!("NSScreenNumber"); - // Retrieve the CGDirectDisplayID associated with this screen - // - // SAFETY: The value from @"NSScreenNumber" in deviceDescription is guaranteed - // to be an NSNumber. See documentation for `deviceDescription` for details: - // - let obj = device_description - .get(ns_string!("NSScreenNumber")) - .expect("failed getting screen display id from device description"); - let obj: *const Object = obj; - let obj: *const NSNumber = obj.cast(); - let obj: &NSNumber = unsafe { &*obj }; + objc2::rc::autoreleasepool(|_| { + let device_description = self.deviceDescription(); - obj.as_u32() + // Retrieve the CGDirectDisplayID associated with this screen + // + // SAFETY: The value from @"NSScreenNumber" in deviceDescription is guaranteed + // to be an NSNumber. See documentation for `deviceDescription` for details: + // + let obj = device_description + .get(key) + .expect("failed getting screen display id from device description"); + let obj: *const Object = obj; + let obj: *const NSNumber = obj.cast(); + let obj: &NSNumber = unsafe { &*obj }; + + obj.as_u32() + }) } #[sel(backingScaleFactor)]