diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 56ab003c8d0b7..41295f26a720d 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -981,10 +981,6 @@ @implementation FlutterTouchInterceptingView { fml::scoped_nsobject _delayingRecognizer; FlutterPlatformViewGestureRecognizersBlockingPolicy _blockingPolicy; UIView* _embeddedView; - // The used as the accessiblityContainer. - // The `accessiblityContainer` is used in UIKit to determine the parent of this accessibility - // node. - NSObject* _flutterAccessibilityContainer; } - (instancetype)initWithEmbeddedView:(UIView*)embeddedView platformViewsController: @@ -1063,14 +1059,15 @@ - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event { - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { } -- (void)setFlutterAccessibilityContainer:(NSObject*)flutterAccessibilityContainer { - _flutterAccessibilityContainer = flutterAccessibilityContainer; -} - - (id)accessibilityContainer { return _flutterAccessibilityContainer; } +- (void)dealloc { + [_flutterAccessibilityContainer release]; + [super dealloc]; +} + @end @implementation DelayingGestureRecognizer { diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index b3337a1d69283..c2357c3dac20d 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -440,7 +440,7 @@ class FlutterPlatformViewsController { - (UIView*)embeddedView; // Sets flutterAccessibilityContainer as this view's accessibilityContainer. -- (void)setFlutterAccessibilityContainer:(NSObject*)flutterAccessibilityContainer; +@property(nonatomic, retain) id flutterAccessibilityContainer; @end @interface UIView (FirstResponder) diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm index 7eb0c2384fe5b..cb30bc36a652d 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObject.mm @@ -867,7 +867,7 @@ - (UIAccessibilityTraits)accessibilityTraits { @end @interface FlutterPlatformViewSemanticsContainer () -@property(nonatomic, retain) UIView* platformView; +@property(nonatomic, assign) UIView* platformView; @end @implementation FlutterPlatformViewSemanticsContainer @@ -876,14 +876,13 @@ - (instancetype)initWithBridge:(fml::WeakPtr)br uid:(int32_t)uid platformView:(nonnull FlutterTouchInterceptingView*)platformView { if (self = [super initWithBridge:bridge uid:uid]) { - _platformView = [platformView retain]; + _platformView = platformView; [platformView setFlutterAccessibilityContainer:self]; } return self; } - (void)dealloc { - [_platformView release]; _platformView = nil; [super dealloc]; } diff --git a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm index 45285d7cc418b..7452c5c097c9e 100644 --- a/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm +++ b/shell/platform/darwin/ios/framework/Source/SemanticsObjectTest.mm @@ -994,19 +994,30 @@ - (void)testFlutterPlatformViewSemanticsContainer { new flutter::testing::MockAccessibilityBridge()); fml::WeakPtr bridge = factory.GetWeakPtr(); __weak FlutterTouchInterceptingView* weakPlatformView; + __weak FlutterPlatformViewSemanticsContainer* weakContainer; @autoreleasepool { FlutterTouchInterceptingView* platformView = [[FlutterTouchInterceptingView alloc] init]; weakPlatformView = platformView; - FlutterPlatformViewSemanticsContainer* container = - [[FlutterPlatformViewSemanticsContainer alloc] initWithBridge:bridge - uid:1 - platformView:platformView]; - XCTAssertEqualObjects(platformView.accessibilityContainer, container); + + @autoreleasepool { + FlutterPlatformViewSemanticsContainer* container = + [[FlutterPlatformViewSemanticsContainer alloc] initWithBridge:bridge + uid:1 + platformView:platformView]; + weakContainer = container; + XCTAssertEqualObjects(platformView.accessibilityContainer, container); + XCTAssertNotNil(weakPlatformView); + XCTAssertNotNil(weakContainer); + } + // Check the variables are still lived. + // `container` is `retain` in `platformView`, so it will not be nil here. XCTAssertNotNil(weakPlatformView); + XCTAssertNotNil(weakContainer); } // Check if there's no more strong references to `platformView` after container and platformView // are released. XCTAssertNil(weakPlatformView); + XCTAssertNil(weakContainer); } - (void)testTextInputSemanticsObject {