跳到主要内容

原生模块生命周期

在 React Native 中,原生模块是单例的。原生模块基础结构会在首次访问时惰性地创建一个原生模块,并在应用需要时一直保留它。这是一种性能优化,可以避免在应用启动时急切地创建原生模块的开销,并确保更快的启动时间。

在纯 React Native 应用中,原生模块只会被创建一次,并且永远不会被销毁。然而,在更复杂的应用中,可能存在原生模块被销毁和重新创建的情况。例如,想象一个混合了原生视图和 React Native 界面的混合应用(brownfield app),正如 与现有应用集成指南中所述。在这种情况下,当用户离开一个 React Native 界面并返回时,销毁和重新创建 React Native 实例可能是有意义的。

当这种情况发生时,无状态的原生模块不会引起任何问题。然而,对于有状态的原生模块,可能需要正确地使原生模块失效,以确保重置状态并释放资源。

在本指南中,您将学习如何正确地初始化和使原生模块失效。本指南假设您熟悉如何编写原生模块,并能熟练地编写原生代码。如果您不熟悉原生模块,请先阅读 原生模块指南

Android

对于 Android,所有原生模块都实现了 TurboModule 接口,该接口定义了两个方法:initialize()invalidate()

initialize() 方法在原生模块创建时由原生模块基础结构调用。这是放置所有需要访问 ReactApplicationContext 的初始化代码的最佳位置。以下是一些实现了 initialize() 方法的核心原生模块:BlobModuleNetworkingModule

invalidate() 方法在原生模块销毁时由原生模块基础结构调用。这是放置所有清理代码、重置原生模块状态和释放不再需要的资源(如内存和文件)的最佳位置。以下是一些实现了 invalidate() 方法的核心原生模块:DeviceInfoModuleNetworkModule

iOS

在 iOS 上,原生模块遵循 RCTTurboModule 协议。然而,该协议不像 Android 的 TurboModule 类那样暴露 initializeinvalidate 方法。

相反,在 iOS 上,还有两个额外的协议:RCTInitializingRCTInvalidating。这些协议分别用于定义 initializeinvalidate 方法。

如果您的模块需要运行一些初始化代码,您可以遵循 RCTInitializing 协议并实现 initialize 方法。要做到这一点,您需要

  1. 修改 NativeModule.h 文件,添加以下几行
NativeModule.h
+ #import <React/RCTInitializing.h>

//...

- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInitializing>
//...
@end
  1. NativeModule.mm 文件中实现 initialize 方法
NativeModule.mm
// ...

@implementation NativeModule

+- (void)initialize {
+ // add the initialization code here
+}

@end

以下是一些实现了 initialize 方法的核心原生模块:RCTBlobManagerRCTTiming

如果您的模块需要运行一些清理代码,您可以遵循 RCTInvalidating 协议并实现 invalidate 方法。要做到这一点,您需要

  1. 修改 NativeModule.h 文件,添加以下几行
NativeModule.h
+ #import <React/RCTInvalidating.h>

//...

- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInvalidating>

//...

@end
  1. NativeModule.mm 文件中实现 invalidate 方法
NativeModule.mm

// ...

@implementation NativeModule

+- (void)invalidate {
+ // add the cleanup code here
+}

@end

以下是一些实现了 invalidate 方法的核心原生模块:RCTAppearanceRCTDeviceInfo