fix(iOS): Fix memory leaks in RNSScreen for brownfield environments #3459
+65
−3
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This PR fixes critical memory leaks in
RNSScreenthat occur when React Native is completely dismissed in brownfield applications. In brownfield environments, when RN views and the Hermes engine are fully torn down,RNSScreenand related objects were not being deallocated, causing significant memory leaks.Root causes identified:
deallocmethod and incomplete timer cleanup insetupProgressNotificationFixes memory leaks in brownfield React Native environments.
Changes
RNSScreenView.controllerproperty fromstrongtoweakreference_retainedControllerinternal property to temporarily hold strong reference until parentViewController takes ownershipRNSWeakProxyclass using NSProxy pattern to break CADisplayLink retain cyclesetupProgressNotificationto handle multipleviewWillDisappearcallsdeallocmethod toRNSScreento properly clean up_animationTimerinvalidatein completion block_retainedControllerinwillMoveToParentViewControllerwhen parent takes ownershipTest code and steps to reproduce
Testing for memory leaks in brownfield environment:
Prerequisites: Brownfield iOS app with React Native integration
Steps:
Verification:
You can add a temporary log to verify dealloc is called:
When you completely dismiss RN, you should see the log message in console.
Expected behavior:
Testing in FabricExample:
Checklist
Note: This is an iOS-only internal implementation fix with no API changes, so TypeScript types and documentation updates are not required.