diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 766cbefa5..94c087f6c 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -165,9 +165,7 @@ pub fn init(alloc: Allocator, opts: rendererpkg.Options) !Metal { pub fn deinit(self: *Metal) void { self.queue.release(); self.device.release(); - - // NOTE: We don't release the layer here because that should be taken - // care of automatically when the hosting view is destroyed. + self.layer.release(); } pub fn loopEnter(self: *Metal) void { diff --git a/src/renderer/metal/IOSurfaceLayer.zig b/src/renderer/metal/IOSurfaceLayer.zig index 4c51a55c2..9212bd5e1 100644 --- a/src/renderer/metal/IOSurfaceLayer.zig +++ b/src/renderer/metal/IOSurfaceLayer.zig @@ -21,11 +21,14 @@ var Subclass: ?objc.Class = null; layer: objc.Object, pub fn init() !IOSurfaceLayer { + // The layer returned by `[CALayer layer]` is autoreleased, which means + // that at the end of the current autorelease pool it will be deallocated + // if it isn't retained, so we retain it here manually an extra time. const layer = (try getSubclass()).msgSend( objc.Object, objc.sel("layer"), .{}, - ); + ).retain(); errdefer layer.release(); // The layer gravity is set to top-left so that the contents aren't