ネイティブモジュールのライフサイクル
React Nativeでは、ネイティブモジュールはシングルトンです。ネイティブモジュールインフラストラクチャは、ネイティブモジュールに最初にアクセスされたときに遅延して作成し、アプリが必要とする限りそれを保持します。これは、アプリの起動時にネイティブモジュールを熱心に作成するオーバーヘッドを回避し、起動時間を短縮するためのパフォーマンス最適化です。
純粋なReact Nativeアプリでは、ネイティブモジュールは一度作成されると、決して破棄されません。しかし、より複雑なアプリでは、ネイティブモジュールが破棄され、再作成されるユースケースがあるかもしれません。たとえば、既存のアプリとの統合ガイドで紹介されているように、一部のネイティブビューと一部のReact Nativeサーフェスを混在させるブラウンフィールドアプリを想像してみてください。この場合、ユーザーがReact Nativeサーフェスから離れるときにReact Nativeインスタンスを破棄し、そのサーフェスに戻ったときに再作成するのが理にかなっているかもしれません。
このような場合、ステートレスなネイティブモジュールは問題を引き起こしません。しかし、ステートフルなネイティブモジュールの場合、状態がリセットされ、リソースが解放されるように、ネイティブモジュールを適切に無効にする必要があるかもしれません。
このガイドでは、ネイティブモジュールを適切に初期化および無効にする方法について説明します。このガイドは、ネイティブモジュールの記述方法に精通しており、ネイティブコードの記述に慣れていることを前提としています。ネイティブモジュールに慣れていない場合は、まずネイティブモジュールガイドを読んでください。
Android
Androidに関しては、すべてのネイティブモジュールはすでにTurboModuleインターフェースを実装しており、これにはinitialize()
とinvalidate()
の2つのメソッドが定義されています。
initialize()
メソッドは、ネイティブモジュールが作成されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、たとえば ReactApplicationContext へのアクセスを必要とするすべての初期化コードを配置するのに最適な場所です。コアのネイティブモジュールの中で initialize()
メソッドを実装しているものには、BlobModule、NetworkingModule などがあります。
invalidate()
メソッドは、ネイティブモジュールが破棄されたときにネイティブモジュールインフラストラクチャによって呼び出されます。これは、すべてのクリーンアップコードを配置し、ネイティブモジュールの状態をリセットし、メモリやファイルなどの不要になったリソースを解放するのに最適な場所です。コアのネイティブモジュールの中で invalidate()
メソッドを実装しているものには、DeviceInfoModule、NetworkModule などがあります。
iOS
iOSでは、Native Modulesは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などがあります。