diff --git a/React/CxxBridge/RCTMessageThread.h b/React/CxxBridge/RCTMessageThread.h index ecdee6d6cc..b15c536d0a 100644 --- a/React/CxxBridge/RCTMessageThread.h +++ b/React/CxxBridge/RCTMessageThread.h @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +#import #import #import @@ -15,7 +16,8 @@ namespace facebook { namespace react { -class RCTMessageThread : public MessageQueueThread { +class RCTMessageThread : public MessageQueueThread, + public std::enable_shared_from_this { public: RCTMessageThread(NSRunLoop *runLoop, RCTJavaScriptCompleteBlock errorBlock); ~RCTMessageThread() override; diff --git a/React/CxxBridge/RCTMessageThread.mm b/React/CxxBridge/RCTMessageThread.mm index f29e47dd03..c340fa7b73 100644 --- a/React/CxxBridge/RCTMessageThread.mm +++ b/React/CxxBridge/RCTMessageThread.mm @@ -31,6 +31,7 @@ RCTMessageThread::RCTMessageThread(NSRunLoop *runLoop, RCTJavaScriptCompleteBloc RCTMessageThread::~RCTMessageThread() { + RCTAssert(m_shutdown, @"RCTMessageThread: quitSynchronous() not called before destructor"); CFRelease(m_cfRunLoop); } @@ -76,10 +77,9 @@ void RCTMessageThread::runOnQueue(std::function &&func) if (m_shutdown) { return; } - - runAsync([this, func = std::make_shared>(std::move(func))] { - if (!m_shutdown) { - tryFunc(*func); + runAsync([sharedThis = shared_from_this(), func = std::make_shared>(std::move(func))] { + if (!sharedThis->m_shutdown) { + sharedThis->tryFunc(*func); } }); } @@ -89,9 +89,9 @@ void RCTMessageThread::runOnQueueSync(std::function &&func) if (m_shutdown) { return; } - runSync([this, func = std::move(func)] { - if (!m_shutdown) { - tryFunc(func); + runSync([sharedThis = shared_from_this(), func = std::move(func)] { + if (!sharedThis->m_shutdown) { + sharedThis->tryFunc(func); } }); }