diff --git a/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m index 246e9186c64bde..54175b6b419e76 100644 --- a/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTAdditionAnimatedNode.m @@ -16,8 +16,8 @@ - (void)performUpdate [super performUpdate]; NSArray *inputNodes = self.config[@"input"]; if (inputNodes.count > 1) { - RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[0]]; - RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[1]]; + RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[0]]; + RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[1]]; if ([parent1 isKindOfClass:[RCTValueAnimatedNode class]] && [parent2 isKindOfClass:[RCTValueAnimatedNode class]]) { self.value = parent1.value + parent2.value; diff --git a/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.h b/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.h index 3632a77a47e75c..198e02c9cfc90f 100644 --- a/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.h +++ b/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.h @@ -17,8 +17,8 @@ @property (nonatomic, readonly) NSNumber *nodeTag; @property (nonatomic, copy, readonly) NSDictionary *config; -@property (nonatomic, copy, readonly) NSDictionary *childNodes; -@property (nonatomic, copy, readonly) NSDictionary *parentNodes; +@property (nonatomic, copy, readonly) NSMapTable *childNodes; +@property (nonatomic, copy, readonly) NSMapTable *parentNodes; @property (nonatomic, readonly) BOOL needsUpdate; diff --git a/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m index be9c843bf7a8d0..0b8bd7ab02f16e 100644 --- a/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTAnimatedNode.m @@ -13,8 +13,8 @@ @implementation RCTAnimatedNode { - NSMutableDictionary *_childNodes; - NSMutableDictionary *_parentNodes; + NSMapTable *_childNodes; + NSMapTable *_parentNodes; } - (instancetype)initWithTag:(NSNumber *)tag @@ -29,12 +29,12 @@ - (instancetype)initWithTag:(NSNumber *)tag RCT_NOT_IMPLEMENTED(- (instancetype)init) -- (NSDictionary *)childNodes +- (NSMapTable *)childNodes { return _childNodes; } -- (NSDictionary *)parentNodes +- (NSMapTable *)parentNodes { return _parentNodes; } @@ -42,10 +42,10 @@ - (instancetype)initWithTag:(NSNumber *)tag - (void)addChild:(RCTAnimatedNode *)child { if (!_childNodes) { - _childNodes = [NSMutableDictionary new]; + _childNodes = [NSMapTable strongToWeakObjectsMapTable]; } if (child) { - _childNodes[child.nodeTag] = child; + [_childNodes setObject:child forKey:child.nodeTag]; [child onAttachedToNode:self]; } } @@ -64,10 +64,10 @@ - (void)removeChild:(RCTAnimatedNode *)child - (void)onAttachedToNode:(RCTAnimatedNode *)parent { if (!_parentNodes) { - _parentNodes = [NSMutableDictionary new]; + _parentNodes = [NSMapTable strongToWeakObjectsMapTable]; } if (parent) { - _parentNodes[parent.nodeTag] = parent; + [_parentNodes setObject:parent forKey:parent.nodeTag]; } } @@ -83,10 +83,10 @@ - (void)onDetachedFromNode:(RCTAnimatedNode *)parent - (void)detachNode { - for (RCTAnimatedNode *parent in _parentNodes.allValues) { + for (RCTAnimatedNode *parent in _parentNodes.objectEnumerator) { [parent removeChild:self]; } - for (RCTAnimatedNode *child in _childNodes.allValues) { + for (RCTAnimatedNode *child in _childNodes.objectEnumerator) { [self removeChild:child]; } } @@ -94,7 +94,7 @@ - (void)detachNode - (void)setNeedsUpdate { _needsUpdate = YES; - for (RCTAnimatedNode *child in _childNodes.allValues) { + for (RCTAnimatedNode *child in _childNodes.objectEnumerator) { [child setNeedsUpdate]; } } @@ -102,7 +102,7 @@ - (void)setNeedsUpdate - (void)updateNodeIfNecessary { if (_needsUpdate) { - for (RCTAnimatedNode *parent in _parentNodes.allValues) { + for (RCTAnimatedNode *parent in _parentNodes.objectEnumerator) { [parent updateNodeIfNecessary]; } [self performUpdate]; diff --git a/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m index 0be3102de6ef71..811382a3bf1888 100644 --- a/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTDiffClampAnimatedNode.m @@ -51,7 +51,7 @@ - (void)performUpdate - (CGFloat)inputNodeValue { - RCTValueAnimatedNode *inputNode = (RCTValueAnimatedNode *)self.parentNodes[_inputNodeTag]; + RCTValueAnimatedNode *inputNode = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:_inputNodeTag]; if (![inputNode isKindOfClass:[RCTValueAnimatedNode class]]) { RCTLogError(@"Illegal node ID set as an input for Animated.DiffClamp node"); return 0; diff --git a/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m index 28a95c8467ec00..0ae3712ef1e364 100644 --- a/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTDivisionAnimatedNode.m @@ -19,8 +19,8 @@ - (void)performUpdate NSArray *inputNodes = self.config[@"input"]; if (inputNodes.count > 1) { - RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[0]]; - RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[1]]; + RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[0]]; + RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[1]]; if ([parent1 isKindOfClass:[RCTValueAnimatedNode class]] && [parent2 isKindOfClass:[RCTValueAnimatedNode class]]) { if (parent2.value == 0) { diff --git a/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m index 40195476012647..adf252cdfceac3 100644 --- a/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTModuloAnimatedNode.m @@ -16,7 +16,7 @@ - (void)performUpdate [super performUpdate]; NSNumber *inputNode = self.config[@"input"]; NSNumber *modulus = self.config[@"modulus"]; - RCTValueAnimatedNode *parent = (RCTValueAnimatedNode *)self.parentNodes[inputNode]; + RCTValueAnimatedNode *parent = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNode]; self.value = fmodf(parent.value, modulus.floatValue); } diff --git a/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m index 679fcd1935999c..c75c00e825e48e 100644 --- a/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTMultiplicationAnimatedNode.m @@ -17,8 +17,8 @@ - (void)performUpdate NSArray *inputNodes = self.config[@"input"]; if (inputNodes.count > 1) { - RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[0]]; - RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)self.parentNodes[inputNodes[1]]; + RCTValueAnimatedNode *parent1 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[0]]; + RCTValueAnimatedNode *parent2 = (RCTValueAnimatedNode *)[self.parentNodes objectForKey:inputNodes[1]]; if ([parent1 isKindOfClass:[RCTValueAnimatedNode class]] && [parent2 isKindOfClass:[RCTValueAnimatedNode class]]) { self.value = parent1.value * parent2.value; diff --git a/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m index 56495d35e20a1b..e25b8cf42d3771 100644 --- a/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTPropsAnimatedNode.m @@ -20,7 +20,7 @@ @implementation RCTPropsAnimatedNode { NSNumber *_connectedViewTag; NSString *_connectedViewName; - RCTUIManager *_uiManager; + __weak RCTUIManager *_uiManager; NSMutableDictionary *_propsDictionary; } @@ -85,18 +85,18 @@ - (void)performUpdate if (!_connectedViewTag) { return; } - - [self.parentNodes enumerateKeysAndObjectsUsingBlock:^(NSNumber *_Nonnull parentTag, RCTAnimatedNode *_Nonnull parentNode, BOOL *_Nonnull stop) { - + + for (NSNumber *parentTag in self.parentNodes.keyEnumerator) { + RCTAnimatedNode *parentNode = [self.parentNodes objectForKey:parentTag]; if ([parentNode isKindOfClass:[RCTStyleAnimatedNode class]]) { [self->_propsDictionary addEntriesFromDictionary:[(RCTStyleAnimatedNode *)parentNode propsDictionary]]; - + } else if ([parentNode isKindOfClass:[RCTValueAnimatedNode class]]) { NSString *property = [self propertyNameForParentTag:parentTag]; CGFloat value = [(RCTValueAnimatedNode *)parentNode value]; self->_propsDictionary[property] = @(value); } - }]; + } if (_propsDictionary.count) { [_uiManager synchronouslyUpdateViewOnUIThread:_connectedViewTag diff --git a/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m index e3bb4d8436c6cd..774cdbf526668c 100644 --- a/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTStyleAnimatedNode.m @@ -37,7 +37,7 @@ - (void)performUpdate NSDictionary *style = self.config[@"style"]; [style enumerateKeysAndObjectsUsingBlock:^(NSString *property, NSNumber *nodeTag, __unused BOOL *stop) { - RCTAnimatedNode *node = self.parentNodes[nodeTag]; + RCTAnimatedNode *node = [self.parentNodes objectForKey:nodeTag]; if (node) { if ([node isKindOfClass:[RCTValueAnimatedNode class]]) { RCTValueAnimatedNode *parentNode = (RCTValueAnimatedNode *)node; diff --git a/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m b/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m index 91b681fdc395d2..b2daa88b2c9c09 100644 --- a/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m +++ b/Libraries/NativeAnimation/Nodes/RCTTransformAnimatedNode.m @@ -41,7 +41,7 @@ - (void)performUpdate NSNumber *value; if ([type isEqualToString: @"animated"]) { NSNumber *nodeTag = transformConfig[@"nodeTag"]; - RCTAnimatedNode *node = self.parentNodes[nodeTag]; + RCTAnimatedNode *node = [self.parentNodes objectForKey:nodeTag]; if (![node isKindOfClass:[RCTValueAnimatedNode class]]) { continue; } diff --git a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m index e69b2d5829e802..f37046612cbe1d 100644 --- a/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m +++ b/Libraries/NativeAnimation/RCTNativeAnimatedNodesManager.m @@ -30,7 +30,7 @@ @implementation RCTNativeAnimatedNodesManager { - RCTUIManager *_uiManager; + __weak RCTUIManager *_uiManager; NSMutableDictionary *_animationNodes; // Mapping of a view tag and an event name to a list of event animation drivers. 99% of the time // there will be only one driver per mapping so all code code should be optimized around that. diff --git a/React/Base/RCTEventDispatcher.m b/React/Base/RCTEventDispatcher.m index 8e9228049f88ab..40a1d63a714068 100644 --- a/React/Base/RCTEventDispatcher.m +++ b/React/Base/RCTEventDispatcher.m @@ -46,7 +46,7 @@ @implementation RCTEventDispatcher // This array contains ids of events in order they come in, so we can emit them to JS in the exact same order. NSMutableArray *_eventQueue; BOOL _eventsDispatchScheduled; - NSMutableArray> *_observers; + NSHashTable> *_observers; NSLock *_observersLock; } @@ -61,7 +61,7 @@ - (void)setBridge:(RCTBridge *)bridge _eventQueue = [NSMutableArray new]; _eventQueueLock = [NSLock new]; _eventsDispatchScheduled = NO; - _observers = [NSMutableArray new]; + _observers = [NSHashTable weakObjectsHashTable]; _observersLock = [NSLock new]; }