跳至主内容
版本:当前版本
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

原生模块生命周期

在 React Native 中,原生模块采用单例模式。模块基础设施会在首次访问时惰性创建实例,并在应用需要时长期持有。这种性能优化避免了应用启动时预先创建原生模块的开销,从而确保更快的启动速度。

在纯 React Native 应用中,原生模块只会创建一次且永不销毁。但在更复杂的应用中,可能存在需要销毁并重建原生模块的场景。例如,在集成到现有应用指南中提到的混合原生视图与 React Native 页面的遗留应用。当用户离开 React Native 页面时销毁实例,返回时再重新创建,这种处理是合理的。

这种机制下,无状态的原生模块不会引发问题。但对于有状态的模块,可能需要正确执行销毁操作以确保状态重置和资源释放。

本指南将探讨如何正确初始化和销毁原生模块。假设您已熟悉原生模块开发并能熟练编写原生代码。若尚未掌握原生模块,请先阅读原生模块指南

Android

在 Android 平台,所有原生模块均已实现TurboModule接口,该接口定义了两个方法:initialize()invalidate()

initialize() 方法会在原生模块创建时由基础设施调用。这是放置初始化代码(例如需要访问 ReactApplicationContext 的操作)的最佳位置。核心模块中实现 initialize() 方法的示例包括:BlobModuleNetworkingModule

invalidate() 方法在原生模块销毁时由基础设施调用。这是执行清理操作的理想位置:重置模块状态、释放不再需要的资源(如内存和文件)。核心模块中实现 invalidate() 方法的示例包括:DeviceInfoModuleNetworkModule

iOS

在 iOS 平台,原生模块遵循 RCTTurboModule 协议。但该协议未提供 Android 平台 TurboModule 类中的 initializeinvalidate 方法。

在 iOS 平台上,Native Modules 需要遵循另外两个协议: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