From 948cbfdacc42f8d2640e69f61df55f6adb823fcf Mon Sep 17 00:00:00 2001 From: zhongwuzw Date: Mon, 16 Dec 2019 23:29:43 -0800 Subject: [PATCH] Add autorelease pool for each run loop for JS Thread (#27395) Summary: Fixes https://github.com/facebook/react-native/issues/27327 , we need to create autorelease pool for each run loop in secondary thread, otherwise application may have memory issues. More details can refer to [CreatingThreads](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html) ![image](https://user-images.githubusercontent.com/5061845/70033738-05fa2980-15eb-11ea-9adb-f01bee937766.png) ## Changelog [iOS] [Fixed] - Add autorelease pool for each run loop for JS Thread Pull Request resolved: https://github.com/facebook/react-native/pull/27395 Test Plan: Example can be found in https://github.com/facebook/react-native/issues/27327. No memory spikes any more. Reviewed By: PeteTheHeat Differential Revision: D19132504 Pulled By: fkgozali fbshipit-source-id: d1747f27d36e9a7934966b34aa46d344e06193b3 --- React/CxxBridge/RCTMessageThread.mm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/React/CxxBridge/RCTMessageThread.mm b/React/CxxBridge/RCTMessageThread.mm index f1d5bee23a1..a510b9942e0 100644 --- a/React/CxxBridge/RCTMessageThread.mm +++ b/React/CxxBridge/RCTMessageThread.mm @@ -36,7 +36,12 @@ RCTMessageThread::~RCTMessageThread() { // This is analogous to dispatch_async void RCTMessageThread::runAsync(std::function func) { - CFRunLoopPerformBlock(m_cfRunLoop, kCFRunLoopCommonModes, ^{ func(); }); + CFRunLoopPerformBlock(m_cfRunLoop, kCFRunLoopCommonModes, ^{ + // Create an autorelease pool each run loop to prevent memory footprint from growing too large, which can lead to performance problems. + @autoreleasepool { + func(); + } + }); CFRunLoopWakeUp(m_cfRunLoop); }