ガベージコレクションするには、Subject を完了する必要がありますか? 質問する

ガベージコレクションするには、Subject を完了する必要がありますか? 質問する

私は Angular コンポーネントで次のようなクリーンアップ パターンに従います。

class SomeComponent implements OnInit, OnDestroy {
    private destroy$ = new Subject();

    ngOnInit() {
        service.someStream().takeUntil(this.destroy$).subscribe(doSomething);
    }

    ngOnDestroy() {
        this.destroy$.next(true);
    }
}

これには、コンポーネントが破棄されたときに自動的にサブスクライブ解除されるという利点があります。

destroy$私の質問は、を呼び出さなかったために への参照が無期限に残るのかthis.destroy$.complete()、それとも親クラスが収集されたときに GC されるのかということです。

ベストアンサー1

ソースを見てみるとSubject.complete答えは見つかります:

complete() {
  if (this.closed) {
    throw new ObjectUnsubscribedError();
  }
  this.isStopped = true;
  const { observers } = this;
  const len = observers.length;
  const copy = observers.slice();
  for (let i = 0; i < len; i++) {
    copy[i].complete();
  }
  this.observers.length = 0;
}

を呼び出すとcomplete、すべてのオブザーバーに通知され、オブザーバーの配列がクリアされます。 への参照を持つオブザーバー/サブスクライバーがない限り、 がガベージ コレクションされるかどうかに影響を与える実装Subjectはありません。completeSubject

RxJS はサブスクライバーに通知をプッシュします。サブスクライバーはオブザーバブルへの参照を保持しません。その逆です。したがって、クロージャーまたは他のメカニズムを介して参照を保持するサブスクライバーを明示的に作成しない限り、ガベージ コレクションのためにSubject呼び出す必要はありません。complete

おすすめ記事