mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-25 19:26:34 +11:00
Fix macos memory leaks (#2739)
* Use a weak reference from WinitView to WinitWindow * Allow patched objc2 version * Add changelog entry
This commit is contained in:
parent
3217eaa416
commit
77f8e511e9
3 changed files with 11 additions and 6 deletions
|
@ -9,6 +9,7 @@ And please only add new entries to the top of this list, right below the `# Unre
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
- Bump MSRV from `1.60` to `1.64`.
|
- Bump MSRV from `1.60` to `1.64`.
|
||||||
|
- Fix macOS memory leaks.
|
||||||
|
|
||||||
# 0.28.2
|
# 0.28.2
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ ndk = "0.7.0"
|
||||||
|
|
||||||
[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
|
[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
|
||||||
core-foundation = "0.9.3"
|
core-foundation = "0.9.3"
|
||||||
objc2 = "=0.3.0-beta.3"
|
objc2 = ">=0.3.0-beta.3, <0.3.0-beta.4" # Allow `0.3.0-beta.3.patch-leaks`
|
||||||
|
|
||||||
[target.'cfg(target_os = "macos")'.dependencies]
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
core-graphics = "0.22.3"
|
core-graphics = "0.22.3"
|
||||||
|
|
|
@ -7,7 +7,7 @@ use objc2::foundation::{
|
||||||
NSArray, NSAttributedString, NSAttributedStringKey, NSCopying, NSMutableAttributedString,
|
NSArray, NSAttributedString, NSAttributedStringKey, NSCopying, NSMutableAttributedString,
|
||||||
NSObject, NSPoint, NSRange, NSRect, NSSize, NSString, NSUInteger,
|
NSObject, NSPoint, NSRange, NSRect, NSSize, NSString, NSUInteger,
|
||||||
};
|
};
|
||||||
use objc2::rc::{Id, Owned, Shared};
|
use objc2::rc::{Id, Owned, Shared, WeakId};
|
||||||
use objc2::runtime::{Object, Sel};
|
use objc2::runtime::{Object, Sel};
|
||||||
use objc2::{class, declare_class, msg_send, msg_send_id, sel, ClassType};
|
use objc2::{class, declare_class, msg_send, msg_send_id, sel, ClassType};
|
||||||
|
|
||||||
|
@ -136,7 +136,8 @@ declare_class!(
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
#[allow(non_snake_case)]
|
#[allow(non_snake_case)]
|
||||||
pub(super) struct WinitView {
|
pub(super) struct WinitView {
|
||||||
_ns_window: IvarDrop<Id<WinitWindow, Shared>>,
|
// Weak reference because the window keeps a strong reference to the view
|
||||||
|
_ns_window: IvarDrop<Box<WeakId<WinitWindow>>>,
|
||||||
pub(super) state: IvarDrop<Box<ViewState>>,
|
pub(super) state: IvarDrop<Box<ViewState>>,
|
||||||
marked_text: IvarDrop<Id<NSMutableAttributedString, Owned>>,
|
marked_text: IvarDrop<Id<NSMutableAttributedString, Owned>>,
|
||||||
accepts_first_mouse: bool,
|
accepts_first_mouse: bool,
|
||||||
|
@ -167,7 +168,10 @@ declare_class!(
|
||||||
forward_key_to_app: false,
|
forward_key_to_app: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
Ivar::write(&mut this._ns_window, window.retain());
|
Ivar::write(
|
||||||
|
&mut this._ns_window,
|
||||||
|
Box::new(WeakId::new(&window.retain())),
|
||||||
|
);
|
||||||
Ivar::write(&mut this.state, Box::new(state));
|
Ivar::write(&mut this.state, Box::new(state));
|
||||||
Ivar::write(&mut this.marked_text, NSMutableAttributedString::new());
|
Ivar::write(&mut this.marked_text, NSMutableAttributedString::new());
|
||||||
Ivar::write(&mut this.accepts_first_mouse, accepts_first_mouse);
|
Ivar::write(&mut this.accepts_first_mouse, accepts_first_mouse);
|
||||||
|
@ -873,11 +877,11 @@ impl WinitView {
|
||||||
// (which is incompatible with `frameDidChange:`)
|
// (which is incompatible with `frameDidChange:`)
|
||||||
//
|
//
|
||||||
// unsafe { msg_send_id![self, window] }
|
// unsafe { msg_send_id![self, window] }
|
||||||
(*self._ns_window).clone()
|
self._ns_window.load().expect("view to have a window")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn window_id(&self) -> WindowId {
|
fn window_id(&self) -> WindowId {
|
||||||
WindowId(self._ns_window.id())
|
WindowId(self.window().id())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn queue_event(&self, event: WindowEvent<'static>) {
|
fn queue_event(&self, event: WindowEvent<'static>) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue