Compare commits

...

2 Commits

Author SHA1 Message Date
Kirill Chibisov
64a97c16c7 Winit version 0.28.3 2023-03-16 22:03:19 +03:00
Mads Marquart
dec45bb09f Fix macos memory leaks (#2739)
* Use a weak reference from WinitView to WinitWindow

* Allow patched objc2 version

* Add changelog entry
2023-03-16 22:03:19 +03:00
4 changed files with 16 additions and 8 deletions

View File

@@ -8,6 +8,10 @@ And please only add new entries to the top of this list, right below the `# Unre
# Unreleased
# 0.28.3
- Fix macOS memory leaks.
# 0.28.2
- Implement `HasRawDisplayHandle` for `EventLoop`.

View File

@@ -1,6 +1,6 @@
[package]
name = "winit"
version = "0.28.2"
version = "0.28.3"
authors = ["The winit contributors", "Pierre Krieger <pierre.krieger1708@gmail.com>"]
description = "Cross-platform window creation library."
edition = "2021"
@@ -68,7 +68,7 @@ ndk = "0.7.0"
[target.'cfg(any(target_os = "ios", target_os = "macos"))'.dependencies]
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]
core-graphics = "0.22.3"

View File

@@ -6,7 +6,7 @@
```toml
[dependencies]
winit = "0.28.2"
winit = "0.28.3"
```
## [Documentation](https://docs.rs/winit)

View File

@@ -7,7 +7,7 @@ use objc2::foundation::{
NSArray, NSAttributedString, NSAttributedStringKey, NSCopying, NSMutableAttributedString,
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::{class, declare_class, msg_send, msg_send_id, sel, ClassType};
@@ -136,7 +136,8 @@ declare_class!(
#[derive(Debug)]
#[allow(non_snake_case)]
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>>,
marked_text: IvarDrop<Id<NSMutableAttributedString, Owned>>,
accepts_first_mouse: bool,
@@ -167,7 +168,10 @@ declare_class!(
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.marked_text, NSMutableAttributedString::new());
Ivar::write(&mut this.accepts_first_mouse, accepts_first_mouse);
@@ -873,11 +877,11 @@ impl WinitView {
// (which is incompatible with `frameDidChange:`)
//
// 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 {
WindowId(self._ns_window.id())
WindowId(self.window().id())
}
fn queue_event(&self, event: WindowEvent<'static>) {