Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 6ff02c1

Browse files
authored
[macOS] Fix FlutterViewController retain cycle (#42317)
Fixes flutter/flutter#127572 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent 515a4bf commit 6ff02c1

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

shell/platform/darwin/macos/framework/Source/FlutterViewController.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ void OnKeyboardLayoutChanged(CFNotificationCenterRef center,
292292

293293
@implementation FlutterViewWrapper {
294294
FlutterView* _flutterView;
295-
FlutterViewController* _controller;
295+
__weak FlutterViewController* _controller;
296296
}
297297

298298
- (instancetype)initWithFlutterView:(FlutterView*)view

shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ - (bool)testViewWillAppearCalledMultipleTimes;
6969
- (bool)testFlutterViewIsConfigured;
7070
- (bool)testLookupKeyAssets;
7171
- (bool)testLookupKeyAssetsWithPackage;
72+
- (bool)testViewControllerIsReleased;
7273

7374
+ (void)respondFalseForSendEvent:(const FlutterKeyEvent&)event
7475
callback:(nullable FlutterKeyEventCallback)callback
@@ -251,6 +252,10 @@ id MockGestureEvent(NSEventType type, NSEventPhase phase, double magnification,
251252
ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testLookupKeyAssetsWithPackage]);
252253
}
253254

255+
TEST(FlutterViewControllerTest, testViewControllerIsReleased) {
256+
ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testViewControllerIsReleased]);
257+
}
258+
254259
} // namespace flutter::testing
255260

256261
#pragma mark - FlutterViewControllerTestObjC
@@ -1016,4 +1021,24 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
10161021
return true;
10171022
}
10181023

1024+
- (bool)testViewControllerIsReleased {
1025+
__weak FlutterViewController* weakController;
1026+
@autoreleasepool {
1027+
id engineMock = flutter::testing::CreateMockFlutterEngine(@"");
1028+
1029+
FlutterRenderer* renderer_ = [[FlutterRenderer alloc] initWithFlutterEngine:engineMock];
1030+
OCMStub([engineMock renderer]).andReturn(renderer_);
1031+
1032+
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engineMock
1033+
nibName:@""
1034+
bundle:nil];
1035+
[viewController loadView];
1036+
weakController = viewController;
1037+
}
1038+
1039+
EXPECT_EQ(weakController, nil);
1040+
1041+
return true;
1042+
}
1043+
10191044
@end

0 commit comments

Comments
 (0)