mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Avoid retaining TurboModuleManager in AppDelegate (#37104)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/37104 The AppDelegate (and other similar classes) only need to construct the TurboModuleManager for intialization purposes, and should not retain it beyond that. TurboModuleManager retains each of the TurboModule instances and through the new binding mechanism, also JSI pointers, which are invalid beyond the lifetime of the JS context. Changelog: [iOS] Changed AppDelegate template to avoid retaining TurboModuleManager. Reviewed By: sammy-SC, cipolleschi Differential Revision: D45310066 fbshipit-source-id: 4199c9973d832cc07fd32b94f2dcbaa72f4d3920
This commit is contained in:
committed by
Facebook GitHub Bot
parent
fe6f70b913
commit
ec1ab73674
@@ -10,7 +10,6 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class RCTSurfacePresenterBridgeAdapter;
|
||||
@class RCTTurboModuleManager;
|
||||
|
||||
/**
|
||||
* The RCTAppDelegate is an utility class that implements some base configurations for all the React Native apps.
|
||||
@@ -95,9 +94,6 @@
|
||||
- (UIViewController *)createRootViewController;
|
||||
|
||||
#if RCT_NEW_ARCH_ENABLED
|
||||
|
||||
/// The TurboModule manager
|
||||
@property (nonatomic, strong) RCTTurboModuleManager *turboModuleManager;
|
||||
@property (nonatomic, strong) RCTSurfacePresenterBridgeAdapter *bridgeAdapter;
|
||||
|
||||
/// This method controls whether the `turboModules` feature of the New Architecture is turned on or off.
|
||||
|
||||
@@ -130,10 +130,12 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
||||
_runtimeScheduler = std::make_shared<facebook::react::RuntimeScheduler>(RCTRuntimeExecutorFromBridge(bridge));
|
||||
std::shared_ptr<facebook::react::CallInvoker> callInvoker =
|
||||
std::make_shared<facebook::react::RuntimeSchedulerCallInvoker>(_runtimeScheduler);
|
||||
self.turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:callInvoker];
|
||||
RCTTurboModuleManager *turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
|
||||
delegate:self
|
||||
jsInvoker:callInvoker];
|
||||
_contextContainer->erase("RuntimeScheduler");
|
||||
_contextContainer->insert("RuntimeScheduler", _runtimeScheduler);
|
||||
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager, _runtimeScheduler);
|
||||
return RCTAppSetupDefaultJsExecutorFactory(bridge, turboModuleManager, _runtimeScheduler);
|
||||
}
|
||||
|
||||
#pragma mark - RCTTurboModuleManagerDelegate
|
||||
|
||||
@@ -82,8 +82,6 @@
|
||||
facebook::react::ContextContainer::Shared _contextContainer;
|
||||
std::shared_ptr<facebook::react::RuntimeScheduler> _runtimeScheduler;
|
||||
#endif
|
||||
|
||||
RCTTurboModuleManager *_turboModuleManager;
|
||||
}
|
||||
@end
|
||||
|
||||
@@ -207,15 +205,18 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
||||
_contextContainer->insert("RuntimeScheduler", _runtimeScheduler);
|
||||
callInvoker = std::make_shared<facebook::react::RuntimeSchedulerCallInvoker>(_runtimeScheduler);
|
||||
#endif
|
||||
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:callInvoker];
|
||||
[bridge setRCTTurboModuleRegistry:_turboModuleManager];
|
||||
|
||||
RCTTurboModuleManager *turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
|
||||
delegate:self
|
||||
jsInvoker:callInvoker];
|
||||
[bridge setRCTTurboModuleRegistry:turboModuleManager];
|
||||
|
||||
#if RCT_DEV
|
||||
/**
|
||||
* Eagerly initialize RCTDevMenu so CMD + d, CMD + i, and CMD + r work.
|
||||
* This is a stop gap until we have a system to eagerly init Turbo Modules.
|
||||
*/
|
||||
[_turboModuleManager moduleForName:"RCTDevMenu"];
|
||||
[turboModuleManager moduleForName:"RCTDevMenu"];
|
||||
#endif
|
||||
|
||||
__weak __typeof(self) weakSelf = self;
|
||||
@@ -229,17 +230,17 @@ static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
||||
if (!bridge) {
|
||||
return;
|
||||
}
|
||||
__typeof(self) strongSelf = weakSelf;
|
||||
|
||||
#if RN_FABRIC_ENABLED
|
||||
__typeof(self) strongSelf = weakSelf;
|
||||
if (strongSelf && strongSelf->_runtimeScheduler) {
|
||||
facebook::react::RuntimeSchedulerBinding::createAndInstallIfNeeded(runtime, strongSelf->_runtimeScheduler);
|
||||
}
|
||||
#endif
|
||||
if (strongSelf) {
|
||||
facebook::react::RuntimeExecutor syncRuntimeExecutor =
|
||||
[&](std::function<void(facebook::jsi::Runtime & runtime_)> &&callback) { callback(runtime); };
|
||||
[strongSelf->_turboModuleManager installJSBindingWithRuntimeExecutor:syncRuntimeExecutor];
|
||||
}
|
||||
|
||||
facebook::react::RuntimeExecutor syncRuntimeExecutor =
|
||||
[&](std::function<void(facebook::jsi::Runtime & runtime_)> &&callback) { callback(runtime); };
|
||||
[turboModuleManager installJSBindingWithRuntimeExecutor:syncRuntimeExecutor];
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user