14

この質問から明確に理解できたと思いました --> IBOutlets は ARC の下で強いか弱いか? しかし、私は最近、私を完全に混乱させた議論をしました. 以下が正しいかどうか誰かが確認できますか?(これが重複している場合、ルールを破るつもりはありませんでした..言葉よりも図をよく理解できるので、明確にする必要があります..)

ここに画像の説明を入力

ARC の下 (MacOSx)

  1. view1 = 強い
  2. MainView = 弱い (WindowControllerA 内)
  3. MainView = strong (ViewControllerB 内)
  4. view2 = 強い
  5. view3 = 弱い (ViewcontrollerB 内)
  6. view3 = strong (ViewControllerC 内)

これが正しければ、誰か確認してください..

上の図では、画面上にwindowControllerA があります。windowControllerA のビューには、2 つの NSView があります。view1 は windowController に属していますが、mainView はインスタンス化された viewController のビューである ViewControllerB に属しています。

ViewControllerB には、mainView 内に 2 つのビューも含まれています。View2 は viewControllerB によって所有され、view3 は別のインスタンス化された viewController である ViewControllerC に属しています。

ViewController C には、それが所有する 1 つのビューがあります。

4

3 に答える 3

19

サブビューのほとんどのアウトレットは、強い参照である必要はありません。結局のところ、サブビューはビュー階層の一部として読み込まれるサブビューだからです。最上位ビューが存在し、親からサブビューを削除しない限り、ビュー階層内のサブビューは、最上位ビューの存続期間中、親によって保持されます。

ARC の前の時代、一部の人々はビュー階層に頼ってビューを保持し、アウトレット プロパティを に設定していましたassign。他の人は、ビュー階層の問題により、いくつかのぶら下がったポインターが残る可能性があるという考えを好まなかったため、プロパティを に設定しましたretain。ARC は弱い参照をゼロにすることを可能にするので、アウトレットがnil指しているオブジェクトが割り当て解除された場合にアウトレットが設定されます。これにより、アウトレットに弱い参照を使用する方がはるかに安全に見えます。一方、 を含むビュー階層が割り当て解除されてもビューへの参照を維持したい場合は、その参照を に設定する必要がありますstrong

ビュー コントローラーは、それが管理する (つまり「所有する」) ビュー階層を担当するため、最上位ビューへの強力な参照を持つ必要があります。viewUIViewController から派生したビュー コントローラーのプロパティはretain(つまり) に設定されているため、これについてあまり心配する必要はありませんstrong

于 2013-09-23T21:49:45.953 に答える
2

私がこれを理解している限り、「すべてのトップレベルのオブジェクトは強いはずです。サブビューは弱いはずです」。その場合、view2も弱いはずです

  • view1 = 強い
  • MainView = 弱い (WindowControllerA 内)
  • MainView = strong (ViewControllerB 内)
  • view2 = 弱い (mainview が既に保持しているため)
  • view3 = 弱い (ViewcontrollerB 内)
  • view3 = strong (ViewControllerC 内)
于 2013-11-08T13:20:33.900 に答える
0

ファイル所有者の IBOutlets 内の .xib オブジェクトへの弱い参照と強い参照について非常に多くの議論があります --- そして、誰もがビューとサブビューだけに関心を持っているようです。

サブビューはそのスーパービューによって所有されているため、ビュー階層をプログラムで破棄しない限り (そして、ビューの所有権について責任を負わない限り)、あまり心配する必要はありません。

しかし --- .xibs で定期的に作成する他のすべてのオブジェクト (NSArrayControllers や、Windows、パネル、アラートなどのビューではないルートレベルの UI アイテムなど) についてはどうでしょうか? --- それらは強く参照する必要がありますか? 弱い?

xib がどのように機能するかについての低レベルの説明が本当に必要です。オブジェクトが「ファイルの所有者」であり、その nib ファイルをロードすると、何がロードされて初期化されますか? IBOutlets を持っているオブジェクトだけですか? すべてのトップレベル オブジェクト?

これらすべてのルートレベルのオブジェクトを所有しているのは誰ですか? 結局のところ、nib をロードするコントローラー (通常は「ファイルの所有者」) が .xib を所有していますが、これは nib のルート レベル オブジェクトを (自動的に) 所有していることを意味しますか?

もしそうなら --- .xib オブジェクトへの弱い IBOutlet 参照がある場合、または強い IBOutlet 参照がある場合、またはまったくない場合の違いは何ですか ---- あなたはまだそのオブジェクトの「ファイルの所有者」です。

いくつかのより良い説明が行われます。

于 2014-08-09T18:57:40.847 に答える