ネイティブモジュールのライフサイクル
React Nativeでは、ネイティブモジュールはシングルトンです。ネイティブモジュールインフラストラクチャは、ネイティブモジュールが最初にアクセスされたときに遅延作成し、アプリが必要とする限り保持します。これは、アプリ起動時にネイティブモジュールを即座に作成するオーバーヘッドを回避し、起動時間を短縮するためのパフォーマンス最適化です。
純粋なReact Nativeアプリでは、ネイティブモジュールは一度作成されると、決して破棄されません。しかし、より複雑なアプリでは、ネイティブモジュールが破棄され、再作成されるユースケースがあるかもしれません。例えば、「既存のアプリとの統合ガイド」で説明されているように、一部のネイティブビューと一部のReact Nativeサーフェスを混在させるブラウンフィールドアプリを想像してください。この場合、ユーザーがReact Nativeサーフェスから離れたときにReact Nativeインスタンスを破棄し、そのサーフェスに戻ったときに再作成するのが理にかなっているかもしれません。
この場合、ステートレスなネイティブモジュールは問題を引き起こしません。しかし、ステートフルなネイティブモジュールの場合、状態をリセットし、リソースを解放するために、ネイティブモジュールを適切に無効化する必要があるかもしれません。
このガイドでは、ネイティブモジュールを適切に初期化および無効化する方法について説明します。このガイドは、ネイティブモジュールを作成する方法に精通しており、ネイティブコードの記述に慣れていることを前提としています。ネイティブモジュールに慣れていない場合は、まず「ネイティブモジュールガイド」を読んでください。
Android
Androidの場合、すべてのネイティブモジュールはすでに2つのメソッド、initialize()とinvalidate()を定義するTurboModuleインターフェースを実装しています。
initialize()メソッドは、ネイティブモジュールが作成されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、例えばReactApplicationContextへのアクセスを必要とするすべての初期化コードを配置するのに最適な場所です。コアからinitialize()メソッドを実装するネイティブモジュールには、BlobModule、NetworkingModuleなどがあります。
invalidate()メソッドは、ネイティブモジュールが破棄されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、すべてのクリーンアップコードを配置し、ネイティブモジュールの状態をリセットし、メモリやファイルなど、不要になったリソースを解放するのに最適な場所です。コアからinvalidate()メソッドを実装するネイティブモジュールには、DeviceInfoModule、NetworkModuleなどがあります。
iOS
iOSでは、ネイティブモジュールはRCTTurboModuleプロトコルに準拠しています。しかし、このプロトコルは、AndroidのTurboModuleクラスによって公開されているinitializeおよびinvalidateメソッドを公開していません。
代わりに、iOSでは、追加の2つのプロトコル、RCTInitializingとRCTInvalidatingがあります。これらのプロトコルは、それぞれinitializeとinvalidateメソッドを定義するために使用されます。
モジュールが初期化コードを実行する必要がある場合は、RCTInitializingプロトコルに準拠し、initializeメソッドを実装できます。そのためには、以下の手順を実行します。
NativeModule.hファイルを以下の行を追加して変更します。
+ #import <React/RCTInitializing.h>
//...
- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInitializing>
//...
@end
NativeModule.mmファイルにinitializeメソッドを実装します。
// ...
@implementation NativeModule
+- (void)initialize {
+ // add the initialization code here
+}
@end
コアからinitializeメソッドを実装するネイティブモジュールには、RCTBlobManager、RCTTimingなどがあります。
モジュールがクリーンアップコードを実行する必要がある場合は、RCTInvalidatingプロトコルに準拠し、invalidateメソッドを実装できます。そのためには、以下の手順を実行します。
NativeModule.hファイルを以下の行を追加して変更します。
+ #import <React/RCTInvalidating.h>
//...
- @interface NativeModule : NSObject <NativeModuleSpec>
+ @interface NativeModule : NSObject <NativeModuleSpec, RCTInvalidating>
//...
@end
NativeModule.mmファイルにinvalidateメソッドを実装します。
// ...
@implementation NativeModule
+- (void)invalidate {
+ // add the cleanup code here
+}
@end
コアからinvalidateメソッドを実装するネイティブモジュールには、RCTAppearance、RCTDeviceInfoなどがあります。