From 14edd5d634b7773f366ebcf4e0311b013858a691 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 31 Jul 2019 10:01:42 -0700 Subject: [PATCH] Break retain cycle in RCTScrollViewComponentView Summary: Breaks cycle by making self weak and storing delegates weakly. Reviewed By: fkgozali Differential Revision: D16579754 fbshipit-source-id: 17174b0e91898a14a86b8b44677090be3044382d --- .../ComponentViews/ScrollView/RCTScrollViewComponentView.mm | 3 ++- React/Fabric/Utils/RNGenericDelegateSplitter.mm | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm index d0297c694d3..3789b003efe 100644 --- a/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm +++ b/React/Fabric/Mounting/ComponentViews/ScrollView/RCTScrollViewComponentView.mm @@ -53,8 +53,9 @@ using namespace facebook::react; _containerView = [[UIView alloc] initWithFrame:CGRectZero]; [_scrollView addSubview:_containerView]; + __weak __typeof(self) weakSelf = self; _scrollViewDelegateSplitter = [[RNGenericDelegateSplitter alloc] initWithDelegateUpdateBlock:^(id delegate) { - self->_scrollView.delegate = delegate; + weakSelf.scrollView.delegate = delegate; }]; [_scrollViewDelegateSplitter addDelegate:self]; diff --git a/React/Fabric/Utils/RNGenericDelegateSplitter.mm b/React/Fabric/Utils/RNGenericDelegateSplitter.mm index 0add6b72b66..44b604838b3 100644 --- a/React/Fabric/Utils/RNGenericDelegateSplitter.mm +++ b/React/Fabric/Utils/RNGenericDelegateSplitter.mm @@ -8,7 +8,7 @@ #import "RNGenericDelegateSplitter.h" @implementation RNGenericDelegateSplitter { - NSMutableArray *_delegates; + NSHashTable *_delegates; } #pragma mark - Public @@ -17,7 +17,7 @@ { if (self = [super init]) { _delegateUpdateBlock = block; - _delegates = [NSMutableArray new]; + _delegates = [NSHashTable weakObjectsHashTable]; } return self; @@ -44,7 +44,7 @@ return; } - _delegateUpdateBlock(_delegates.count == 1 ? _delegates.firstObject : self); + _delegateUpdateBlock(_delegates.count == 1 ? [_delegates allObjects].firstObject : self); } #pragma mark - Fast Forwarding