4

インタフェースビルダーとARCに関する興味深い質問があります。私はxibで初期化されるビューコントローラを構築しています。インターフェイスビルダーのタップ&ドラッグ機能を使用して、xibに必要なプロパティーアウトレットを作成します。これは、(弱い、非原子的な)プロパティを初期化します。私にはうまく聞こえる。ARCとInterface Builder

私には、[self setCategoryButton:nil];のような行がviewDidUnloadに自動的に追加されてしまうことがあります。私はARCの前にこれを理解して使用しました。ただし、これらは弱い参照であるため、ビューがアンロードされると自動的に消去されませんか?

私はこれらのプロパティが他のオブジェクトによって保持されている場合、これらのプロパティをゼロにすることができると考えていますが、それは私には珍しいケースです...その点についてさらにフィードバックを得たいと思っています。プロパティがweakあるので

おかげで、

クルト

答えて

4

私はこれに対してしばらく前にバグを報告しました。私はこれが意図的な動作であったということでした。Xcodeはビューに対する他の強い参照がないことを確認できないので、実際にはを保証することはできません。弱点ポインタは-viewDidUnloadで自動的にクリアされます。したがって、彼らはあなたのためにそれをクリアします。

個人的には、これは不自由な理由だと思いますが、それが理由です。

0

は、あなたのオブジェクト内の参照は、オブジェクトの保持カウントには影響しません。ですから、オブジェクトをゼロに設定することに意味はありません。少なくともそれは私がそれを理解する方法です。

3

これは、iOS5以降ではnilに設定されます(iOS 4では自動的に弱いポインタはありません)。自動生成されたコードでは安全のためにそこにあります。私はこれについて自分自身について疑問に思っていた。それが私が思いつく唯一の理由だ。ドキュメントから

+0

デプロイメントターゲットにiOS 4が含まれている場合は、とにかく弱いポインタを使用できなくなります。彼らは 'unsafe_unretained'になります。 –

+0

良い点。実際には、このようなバグを報告するのではなく、私のように漠然とした気にさせるのではなく、 – jrturton

3

、viewDidUnload

  • は「この方法は...最終的なクリーンアップを実行するチャンスです。...」
  • 「メモリ不足の状態が発生した場合、現在のView Controllerのビューは、システムが

      弱い(セッターセマンティクス)について、文書から

    「メモリからこれらのビューを削除することを選ぶことが、必要とされていません

  • 宛先オブジェクトとの関係が弱い(所有していない)ことを指定します。 宛先オブジェクトが割り当て解除された場合、プロパティ値は自動的にnilに設定されます。

だから明らかです。それは規則に一貫しています。 あなたのプロパティが指し示すオブジェクトについてではなく、上記の弱いルールに基づいてあなたのプロパティを無効にするだけです。

viewDidUnloadは、それはそのオブジェクトが割り当て解除されているので、あなたの弱い性質が(ビューコントローラのライフサイクルにおけるviewDidUnloadの場所に基づいて)任意のオブジェクト、 をポイントすることはできませんだと仮定します。そして単にそれをゼロで清める。

弱いルールとメモリを効率的に使っても安全です。 コンパイラは、あなたが尖っているオブジェクトの世話をしたことを確信することはできません。 彼は、クリーンアップを確実にする必要があります。

関連する問題