親UIViewがあるとします。このUIViewには、サブビューUIImageViewへの弱いポインターがあります。UIViewが現在画面に表示されている場合、親UIviewはUIImageViewへの弱参照しかないため、画像ビューがガベージコレクションされる可能性はありますか?
FYIUIviewとUIImageViewの両方が画面に表示されます
親UIViewがあるとします。このUIViewには、サブビューUIImageViewへの弱いポインターがあります。UIViewが現在画面に表示されている場合、親UIviewはUIImageViewへの弱参照しかないため、画像ビューがガベージコレクションされる可能性はありますか?
FYIUIviewとUIImageViewの両方が画面に表示されます
このUIViewには、サブビューUIImageViewへの弱いポインターがあります
止まる。UIImageViewがUIViewのサブビューである場合、UIViewにはUIImageViewへの強力なポインターがあります。物語の終わり。
つまり、ビューはそのサブビューを保持します。サブビューがサブビューである限り、煙の中で消えることはありません。
一方、そのサブビューを削除すると、そのメモリ管理について心配する必要があります。そうしないと、煙の中で消えてしまう可能性があります。
サブビューが作成され、ビューのサブビュー階層に直接追加されることが予想される場合は、サブビューで「weak」プロパティを使用します。UIView addSubview:
すでにビューへの強力な参照を保持しています。
ビューがUIViewControllerの弱いプロパティである場合、通常はNIBから、またはで作成します-(void)viewDidLoad
。コントローラのビューが不要になったために破棄された場合、サブビューも破棄されます。
ビューにサブビューを追加すると、定義上、そのサブビューへの強力な参照が維持されます。addSubview
これは、ビュー階層を維持するための内部プロセスの一部にすぎません。ビューは、サブビューが手動で削除されるまで(たとえば、経由でremoveFromSuperview
)、またはスーパービュー自体が削除されるまで(たとえば、ビューコントローラを閉じた場合)、サブビューへのこの強力な参照を保持します。
weak
ビューがサブビューで内部的に維持するこれらの強力な参照を、ユーザー(またはIB)がビューまたはビューコントローラーのサブクラス.hファイルに追加する可能性のある参照と混同しないでください。これらweak
の参照は、サブビューまたはコントロールを参照するための便利な方法を提供しているだけです。.hファイルにweak
サブビューへの参照があるという事実(たとえば、IBOutlet
利益のため)は、ビューが全体的なビュー階層の一部として舞台裏でサブビューへの強い参照を自動的に持っているという事実を変更しません。
したがって、画像ビューなどのサブビューは、最後の強力な参照が削除された場合(または、非ARC言語では、保持カウントがゼロになった場合)にのみ割り当てが解除されます。画像ビューをサブビューとして追加した場合、その強い参照が削除されるまで(つまり、画像ビューがそのスーパービューから削除されるか、スーパービュー自体が削除されるまで)、割り当てが解除されません。明らかに、コントロールへの他の強力な参照を維持している場合、サブビューを解放するには、それらも削除する必要があります。
警告:ARCを使用していない場合、つまり手動で参照カウントを行っている場合(手動で呼び出しrelease
てなどautorelease
)、プログラミングミスを犯して画像ビューを「オーバーリリース」し、それによって保持を許可する可能性があります。カウントはゼロに低下するため、時期尚早に割り当てを解除できます。ただしweak
、質問でプロパティを参照していることを考えると、ARCを使用している必要があるため、この観察結果は重要ではありません。
変数の乱暴な使用が問題を引き起こす可能性がある他の状況もありweak
ますが、サブビューがまったく表示されないことを教えてくれない限り、詳しく説明することを躊躇します。
(ちなみに、質問の中でガベージコレクション(GC)について言及されていますが、本当の質問は「私のサブビューが割り当て解除されている可能性はありますか...」だったと思います。明らかに、iOSにはGCがありません。本当の問題は、サブビューがスーパービューにまだ存在している間に、サブビューの割り当てが解除される可能性があるかどうかであると想定します。)
UIVIewにUIImageViewが追加されている場合、参照はそのアクションによってインクリメントされ、ビューから削除されるまで解放されません。
なぜあなたがこれを尋ねたのかわからないので、文字列参照を持っていても害はないと思います。UIViewがクリーンアップされた時点で、uiimageviewも逆参照され、解放されるからです。それから。
また、ガベージコレクションとおっしゃっていましたが、iOSにはガベージコレクションがありません。私はあなたが何を意味するのか知っています