メインコンテンツへスキップ

ネイティブモジュールのライフサイクル

React Nativeでは、ネイティブモジュールはシングルトンです。ネイティブモジュールインフラストラクチャは、ネイティブモジュールに最初にアクセスされたときに遅延して作成し、アプリが必要とする限りそれを保持します。これは、アプリの起動時にネイティブモジュールを熱心に作成するオーバーヘッドを回避し、起動時間を短縮するためのパフォーマンス最適化です。

純粋なReact Nativeアプリでは、ネイティブモジュールは一度作成されると、決して破棄されません。しかし、より複雑なアプリでは、ネイティブモジュールが破棄され、再作成されるユースケースがあるかもしれません。たとえば、既存のアプリとの統合ガイドで紹介されているように、一部のネイティブビューと一部のReact Nativeサーフェスを混在させるブラウンフィールドアプリを想像してみてください。この場合、ユーザーがReact Nativeサーフェスから離れるときにReact Nativeインスタンスを破棄し、そのサーフェスに戻ったときに再作成するのが理にかなっているかもしれません。

このような場合、ステートレスなネイティブモジュールは問題を引き起こしません。しかし、ステートフルなネイティブモジュールの場合、状態がリセットされ、リソースが解放されるように、ネイティブモジュールを適切に無効にする必要があるかもしれません。

このガイドでは、ネイティブモジュールを適切に初期化および無効にする方法について説明します。このガイドは、ネイティブモジュールの記述方法に精通しており、ネイティブコードの記述に慣れていることを前提としています。ネイティブモジュールに慣れていない場合は、まずネイティブモジュールガイドを読んでください。

Android

Androidに関しては、すべてのネイティブモジュールはすでにTurboModuleインターフェースを実装しており、これにはinitialize()invalidate()の2つのメソッドが定義されています。

initialize() メソッドは、ネイティブモジュールが作成されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、たとえば ReactApplicationContext へのアクセスを必要とするすべての初期化コードを配置するのに最適な場所です。コアのネイティブモジュールの中で initialize() メソッドを実装しているものには、BlobModuleNetworkingModule などがあります。

invalidate() メソッドは、ネイティブモジュールが破棄されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、すべてのクリーンアップコードを配置し、ネイティブモジュールの状態をリセットし、メモリやファイルなどの不要になったリソースを解放するのに最適な場所です。コアのネイティブモジュールの中で invalidate() メソッドを実装しているものには、DeviceInfoModuleNetworkModule などがあります。

iOS

iOSでは、Native ModulesはRCTTurboModuleプロトコルに準拠しています。しかし、このプロトコルはAndroidのTurboModuleクラスによって公開されているinitializeおよびinvalidateメソッドを公開していません。

代わりに、iOSには2つの追加プロトコルがあります。RCTInitializingRCTInvalidatingです。これらのプロトコルは、それぞれinitializeメソッドとinvalidateメソッドを定義するために使用されます。

モジュールが初期化コードを実行する必要がある場合は、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などがあります。