From 61cfa97067eec6d33c23670ae2128348fcff5d1b Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Thu, 1 Oct 2020 09:36:03 -0700 Subject: [PATCH] Breaking a retain cycle between `RCTSurfaceTouchHandler` and `RCTFabricSurface` (another approach) Summary: This is a different approach to break the retain cycle: instead of detaching a view manually, we store a pointer to a view weakly. I am working on some change that will make possible (and make use of it) to call `start` and `stop` on Surface objects mutiple times, so to make it happens we need to remove detaching from `stop` method. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D24041524 fbshipit-source-id: 700b13d715d2eb84d52bf3e51e0fd2896a55baf8 --- React/Fabric/RCTSurfaceTouchHandler.h | 4 ++++ React/Fabric/RCTSurfaceTouchHandler.mm | 5 ++++- React/Fabric/Surface/RCTFabricSurface.mm | 1 - 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/React/Fabric/RCTSurfaceTouchHandler.h b/React/Fabric/RCTSurfaceTouchHandler.h index 1c642be78f5..b20e195322a 100644 --- a/React/Fabric/RCTSurfaceTouchHandler.h +++ b/React/Fabric/RCTSurfaceTouchHandler.h @@ -11,6 +11,10 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTSurfaceTouchHandler : UIGestureRecognizer +/* + * Attaches (and detaches) a view to the touch handler. + * The receiver does not retain the provided view. + */ - (void)attachToView:(UIView *)view; - (void)detachFromView:(UIView *)view; diff --git a/React/Fabric/RCTSurfaceTouchHandler.mm b/React/Fabric/RCTSurfaceTouchHandler.mm index c3edd4eed62..387908ccf6d 100644 --- a/React/Fabric/RCTSurfaceTouchHandler.mm +++ b/React/Fabric/RCTSurfaceTouchHandler.mm @@ -159,7 +159,10 @@ struct PointerHasher { std::unordered_map<__unsafe_unretained UITouch *, ActiveTouch, PointerHasher<__unsafe_unretained UITouch *>> _activeTouches; - UIView *_rootComponentView; + /* + * We hold the view weakly to prevent a retain cycle. + */ + __weak UIView *_rootComponentView; IdentifierPool<11> _identifierPool; } diff --git a/React/Fabric/Surface/RCTFabricSurface.mm b/React/Fabric/Surface/RCTFabricSurface.mm index 728bdcf0f8e..9d73a3d3caa 100644 --- a/React/Fabric/Surface/RCTFabricSurface.mm +++ b/React/Fabric/Surface/RCTFabricSurface.mm @@ -83,7 +83,6 @@ using namespace facebook::react; } [_surfacePresenter unregisterSurface:self]; - [_touchHandler detachFromView:_view]; return YES; }