diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index f6e9aa3eb957f..e23474159af4d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -292,7 +292,7 @@ void OnKeyboardLayoutChanged(CFNotificationCenterRef center, @implementation FlutterViewWrapper { FlutterView* _flutterView; - FlutterViewController* _controller; + __weak FlutterViewController* _controller; } - (instancetype)initWithFlutterView:(FlutterView*)view diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index fd2331c1ffa32..1628aa004ef4d 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -69,6 +69,7 @@ - (bool)testViewWillAppearCalledMultipleTimes; - (bool)testFlutterViewIsConfigured; - (bool)testLookupKeyAssets; - (bool)testLookupKeyAssetsWithPackage; +- (bool)testViewControllerIsReleased; + (void)respondFalseForSendEvent:(const FlutterKeyEvent&)event callback:(nullable FlutterKeyEventCallback)callback @@ -251,6 +252,10 @@ id MockGestureEvent(NSEventType type, NSEventPhase phase, double magnification, ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testLookupKeyAssetsWithPackage]); } +TEST(FlutterViewControllerTest, testViewControllerIsReleased) { + ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testViewControllerIsReleased]); +} + } // namespace flutter::testing #pragma mark - FlutterViewControllerTestObjC @@ -1016,4 +1021,24 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove { return true; } +- (bool)testViewControllerIsReleased { + __weak FlutterViewController* weakController; + @autoreleasepool { + id engineMock = flutter::testing::CreateMockFlutterEngine(@""); + + FlutterRenderer* renderer_ = [[FlutterRenderer alloc] initWithFlutterEngine:engineMock]; + OCMStub([engineMock renderer]).andReturn(renderer_); + + FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engineMock + nibName:@"" + bundle:nil]; + [viewController loadView]; + weakController = viewController; + } + + EXPECT_EQ(weakController, nil); + + return true; +} + @end