4

Cocoa のビュー階層とは異なり、オブジェクトの階層を作成する ARC 対応のフレームワークを作成しています。各コントローラ オブジェクトは、複数のサブコントローラを持つことができます。コントローラーは相互に参照している可能性があり、保持サイクルが発生する潜在的なリスクがあります。

保持サイクルを回避する方法を知っています。保持サイクルが存在し、オブジェクトの割り当て解除を妨げていることをプログラムで検出する方法があるかどうかを知りたいですか?

ある時点で、既存のルート コントローラーは新しいルート コントローラーに置き換えられます。ARC を使用しているため、retainCount を使用して既存のコントローラーの保持カウントを確認することはできません。とにかく私が読んだことから、これは信頼されるべきではありません。

ルート コントローラに 2 つのサブ コントローラがあり、それぞれが相互に強い参照を持つテスト セットアップがあります。その場合、ルート コントローラーは dealloc を実行せず、ルート コントローラーが新しいコントローラーに置き換えられたときに他の 2 つのコントローラーも実行しません。予想通り。このシナリオを考えると、そのルート コントローラーが実際に割り当てを解除したかどうかを判断する何らかの方法があるはずだと考えていました。

考えられる解決策:コントローラーを交換する直前に、交換対象のルート コントローラーをグローバル オブジェクトのゼロ設定の弱いプロパティに割り当てました。次に、タイマーを設定して、プロパティが nil かどうかを一瞬で確認できるようにしました。nil の場合、コントローラは割り当てを解除しました。nil でない場合は、階層内のどこかで保持サイクルが原因である可能性が高いメモリ リークを示している可能性があります。その場合、交換されたコントローラーが nil でない限り、開発者の注意を引くためにログ ステートメントを出力します。

これは機能しますが、代替の (より良い) ソリューションはありますか? または、このソリューションで考えられる警告はありますか?

具体的には、オブジェクトの割り当てが解除されるまでにどれくらいの時間が経過する可能性がありますか?これは瞬時に行われることが保証されていますか?それとも割り当て解除を遅らせることができますか?

4

1 に答える 1

0

Cocoa のビュー階層と同じように、オブジェクトの階層を作成する ARC 対応のフレームワークを作成しています…</p>

すぐそこでやめなさい。その関係を階層に導入するだけです。ビューには親、サブビューなどがあります。それらがどのように相互作用し、適切な長さで相互に存続するかを検討してください。オブジェクトに必要なリレーションについて教え、自分でクリーンアップする方法を教えます。簡略化:

- (void)tearDownState
{
  if (self.isTearingDown)
    return;

  [self setTearingDown];
  for (Node * at in self.subnodes) {
    [at tearDownState];
  }
  self.subnodes = 0;
  ...

次に、ノード (ルートなど) も交換する必要がある場合は、ノードを交換するように教えます。

于 2012-09-27T09:24:01.487 に答える