2012-06-20 6 views
9

私はiOS 4をサポートするプロジェクトを持っていたので、すべての私のIBOutletsはペン先にあってコントローラのメインビュー(同じペン先で別々のビュー)の外にあったIBOutletsでさえもすべて役に立ちました。 弱いとunsafe_unretainedの違い

だから時間が来ており、現在クライアントは、iOS 5のみをサポートしたいので、私たちのチームに変更になりましたすべての __unsafe_unretained __weak IBOutletsためIBOutletsが、( viewdidloadを除く) nilに設定されているメインビュー内ではありませんのでIBOutlets後で追加することはできません。

もし私が考えているのであれば、ビュー(メインビュー)がそれらのIBOutletを保持していなければ、それらを割り当て解除してゼロにする必要があります(私はそれが正しい単語かどうかわかりません)。これらIBOutletsから

__weakを削除しかし、何が私には意味がないことは、私の頭の中でunsafe_unretainedものが割り当て解除されなければならないとアプリがそれらにアクセスしようとしたとき、彼らは指している必要があり、unsafe_unretainedweakの間ではなぜ異なる動作です無効な参照にしてアプリがクラッシュするはずです。

私はunsafe__unretainedがweakと同じだがゼロ調整がないと思った。

ここに何か不足していますか?

ありがとうございました。

+4

あなたは正しいですか? unsafe_unretainedは参照をnilしません。 – Francesco

答えて

5

私はunsafe__unretainedがweakと同じだがゼロ化していないと思った。

はいです。

ココアは、ペン先をロードすると、それはすべてのオブジェクトが自動解放作成し、そのviewDidLoadが呼び出されたとき、彼らはまだそこにあります。ただし、自動解放プールの有効期間は、制御が実行ループに戻るときに終了します。この時点で、何も所有していないオブジェクトはすべて消えてしまい、その時点で弱い店舗はゼロになります。

ほとんどのアウトレットでは、NIB内のオブジェクトは既に一般的には何らかの形で所有されているため、これは問題ではありません。たとえば、ビュー内のボタンはその親ビューによって所有されています。したがって、そのボタンを指し示す強力なアウトレットを持つことは、過度の過失であるか、または悪化すると、保持サイクルにつながる可能性があります。彼らは何か他のもの、例えばによって所有される必要があるので、

トップレベルのオブジェクトは明らかにそれらを所有する親ビューを持っていない

コントローラーまたは「ファイルの所有者」。何かが消えるのを発見した場合は、Fileの所有者にIBOutletを作成する必要があります。

詳細については、Apple's docsを参照してください。あなたの古い__unsafe_unretained参照を介して割り当て解除のオブジェクトにアクセスしようとすると、あなたは正しい

+1

それはたくさんの意味がありますが、私はそれを完全に認識していますが、私の質問はなぜunsafe_unretainedを使用すると、それらのIBOutletsは決して割り当て解除されず、いつでも(いつでも)使えるのですか? – Ecarrion

+0

@エカリオン、私の意見では、メモリチャンクは上書きされず、上書きされないまではそこにいます。上書きされると、アプリは不正なアクセスを取得します。 – MANN

0

は、アプリがクラッシュします。

オブジェクトが強い参照でアプリの他の部分で参照されている可能性が高いためです。

ゾンビを有効にして実行してみてください。想定していない古いポインタを逆参照すると、すぐにクラッシュするはずです。

1

この質問に遭遇する将来の調査者のために、私はCRDのStackoverflow answer同様の質問が説明するかもしれないと思う。オブジェクトが割り当て解除されていても、安全でない未保持ポインタ(実際のオブジェクトデータを含む)によって参照されるメモリは必ずしもゼロになるわけではないので、メモリが実際に再利用/変更/ゼロ化されるまで正しく動作するように見えます。

関連する問題