diff --git a/shell/platform/darwin/macos/framework/Source/FlutterSurface.mm b/shell/platform/darwin/macos/framework/Source/FlutterSurface.mm index d2726560d74bd..109740942621d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterSurface.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterSurface.mm @@ -52,21 +52,21 @@ - (instancetype)initWithSize:(CGSize)size device:(id)device { return self; } -static void ReleaseSurface(void* surface) { - if (surface != nullptr) { - CFBridgingRelease(surface); - } -} - - (FlutterMetalTexture)asFlutterMetalTexture { - FlutterMetalTexture res; - memset(&res, 0, sizeof(FlutterMetalTexture)); - res.struct_size = sizeof(FlutterMetalTexture); - res.texture = (__bridge void*)_texture; - res.texture_id = self.textureId; - res.user_data = (void*)CFBridgingRetain(self); - res.destruction_callback = ReleaseSurface; - return res; + return FlutterMetalTexture{ + .struct_size = sizeof(FlutterMetalTexture), + .texture_id = self.textureId, + .texture = (__bridge void*)_texture, + // Retain for use in [FlutterSurface fromFlutterMetalTexture]. Released in + // destruction_callback. + .user_data = (__bridge_retained void*)self, + .destruction_callback = + [](void* user_data) { + // Balancing release for the retain when setting user_data above. + FlutterSurface* surface = (__bridge_transfer FlutterSurface*)user_data; + surface = nil; + }, + }; } + (FlutterSurface*)fromFlutterMetalTexture:(const FlutterMetalTexture*)texture {