1

私は多くの記事を読みましたが、実際に読んだとき、何かを見逃していると思います.

私は、他のView Controllerの上に表示されるモジュールのシングルトンオブジェクトを設定しているアプリケーションを持っています。このシングルトンオブジェクトは、他の子オブジェクトをインスタンス化します。タスクを完了した後、コントローラーを閉じて、nilをシングルトンオブジェクトに設定しています。このモジュールによって作成された多くのオブジェクトはまだ生きています。

私の最初の質問は、コントローラーを却下して、そのすべての子オブジェクトの割り当てを解除するかどうかです。または、明示的に nil に設定する必要があります。

これらのオブジェクトが将来的に割り当てを解除された場合 (インストルメント リークによって表示されず、保持サイクルがないため、リークではありません)、またはそれらを必要としないため、nil に設定して明示的に強制する必要があります。メモリを浪費しています。

これらのいくつかの強力なプロパティと 2 つまたは 3 つのインスタンス変数がまだ残っているのは、そのスーパー親 (つまり、シングルトン オブジェクト) の割り当てを解除したときです。

<x06...>オブジェクト リストのインストゥルメントによって表示される名前を持つオブジェクト、またはコード メソッドによって割り当てられるオブジェクトがいくつかありますmalloc。これらのオブジェクトの割り当てについて心配する必要がありますか?

4

3 に答える 3

2

最初の質問:いいえ、単に解放を呼び出します: 参照カウントを 1 減らしますが、参照カウントが 0 の場合は解放します。

コントローラーを却下した後、生きているオブジェクトへの参照を誰が取得するかを確認してください。

このコントローラーは、割り当てを解除するすべてのオブジェクトへのすべての参照を取得する必要があり、このコントローラーのみで、それ以上の参照はありません。

ARCでのnil設定について。はい、これは良い習慣です。たとえば、すべてのアウトレットは自動的に (右ボタンで IB からコードにドラッグすると)、(nonatomic、weak) として作成されます。Weak -オブジェクトの割り当てが解除されたときにnilに設定されることを意味します。

また、ARC、nils などについて: http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

于 2012-12-24T19:59:10.403 に答える
1

is dismissing a controller deallocate all its child object or not? or i have to explicitly set it to nil.

はい、リリースと呼びます。そしてその後、彼らに割り当てるnilことは単なることです。

nil古いオブジェクトを解放した後、ガベージを指していないことを確認できます。オブジェクトへの nil の割り当てまたはメモリ ポインタへの NULL の割り当ては同様です。

そして、release-ing は、その時点からその記憶が利用可能になるという意味ではありません。かなりの時間そこにとどまり、OS がこれらよりも十分なメモリを見つけられない場合、release-d メモリは OS によって使用されます。

于 2012-12-24T19:51:21.430 に答える
0

コントローラを閉じると、そのすべての子オブジェクトの割り当てが解除されますか?

本質的にではありません。場合によります。アプリケーションでオブジェクトへの強い参照がなくなった後、オブジェクトの割り当てが解除されます。

したがって、たとえば、コントローラーを参照する強力なインスタンス変数がある場合、それを閉じても、それを強力に参照しているため、割り当て解除にはなりません。ただし、nil後で設定し、オブジェクトへの強力な参照が他にない場合は、割り当てが解除されます。

一方、コード内にそれへの強い参照がない場合、それへの唯一の強い参照は提示されているView Controllerからのものであるため、それを却下すると、アプリケーション内でそれへの強い参照はなくなります。 、したがって、却下された後に割り当てが解除されます。

スーパー親(つまり、単一のオブジェクト)の割り当てを解除したときに、これらのいくつかの強力なプロパティと2つまたは3つのインスタンス変数がまだ残っているのはなぜですか。

ここで用語が混同されています。「スーパーペアレント」というものはありません。スーパークラスとスーパービューがありますが、それらのいずれかを意味するかどうかは明確ではありません。取り除くことができない永続的なオブジェクトがある場合は、使用しているコードを投稿してください。

于 2012-12-25T00:49:16.020 に答える