1

以下について

NSImage *image = [[UIImage imageNamed:@"foo.png"] retain];
...
[image release];

私の理解では、imageNamed から返されたオブジェクトは自動解放されると思われます。ただし、オブジェクトには保持があり、その後明示的に解放されるためです。明示的なリリースは、参照カウントを減らすだけでなく、後で GC されるのを待つ代わりに、オブジェクト全体のリリースをトリガーします。release 呼び出しが行われると、iOS はまずオブジェクトの参照カウントを減らそうとし、その時点で他のボディがオブジェクトを参照していないことを確認すると、割り当てられたメモリを解放することを決定します。正しい理解と仮定ですか?

4

3 に答える 3

2

いいえ、それは正しくありません。

さらに、メモリ管理の用語を少し緩めているため、質問が少し混乱しています。

これらすべての側面の詳細な議論は、SO の投稿には多すぎます。

自動解放プールはガベージ コレクションではありません。単なるオブジェクトの集まりと考えてください。オブジェクトを自動解放すると、オブジェクトがプールに追加されます。プールが空になると、基本的にプール内の各オブジェクトで release が呼び出されます (そのため、autorelease プールという名前が付けられています)。

したがって、自動解放されたオブジェクトがあり、追加のretain呼び出しを (対応する解放なしで) 行った場合、自動解放プールはオブジェクトの割り当てを解除しません。本来のように一度だけ解放します。

オブジェクトへの他の参照を保持している場合、オブジェクトは自動解放プールを過ぎても存続します。

保持/解放を複数回呼び出すと、カウントが増減するだけです。オブジェクトは、カウントがゼロになるまで解放されません。

于 2012-09-10T16:31:27.133 に答える
1

それは正しい仮定ではありません。はreleaseを概念的に否定しretainます。ただし、そこに浮かんでいる可能性のある他の参照カウントについて知ることはできません。あなただけの場合retain、それはすぐに破壊されます。それは確かにそうではありません。

自動解放されたオブジェクトを取得していることはわかっているので、retain参照が唯一のものではないことがわかります。自動解放のソースからの元の参照は、現在の自動解放プールが空になるまで残ります。したがって、ここではあなたの仮定に欠陥があります。

release 呼び出しが行われると、iOS はまずオブジェクトの ref カウントを減らそうとします。次に、その時点で他のボディがオブジェクトを参照していないことを確認し、割り当てられたメモリを解放することを決定します。

...元のオートリリースからの参照が残るためです。

一般的に言えば、オブジェクトの割り当てが解除される正確な時期について、想定を立てる必要はありません。自分の保持数のバランスを取ることだけを心配し、うまくいくことを信じてください。retainこの例では、独自の参照や想定された参照よりもはるかに多くの参照が存在する可能性がありますautorelease。フレームワークは、バランスが保たれている限り、バックグラウンドで自由に保持および解放できます。

最後に、ARCを使用して、これらすべてを忘れてください:)

于 2012-09-10T16:30:06.693 に答える
1

そのようなガベージコレクションはありません。厳密には、それ自体の参照をカウントするオブジェクトです。オブジェクトが作成されると、参照カウントが 1 になります。この場合、オブジェクトを作成するメソッド -- imageNamed:-- は、オブジェクトを自動解放プールに入れます。これは、プールが 1 つの参照の所有者であることを意味し、後で (このメソッドが終了した後) 参照を自動的に解放します。

オブジェクトの参照カウントが 0 になると、そのdeallocメソッドを実行することによってオブジェクト自体が破棄されます。

イメージ (自動解放プールによって所有されている) への送信retainは、別の参照 (別の所有者) があることを意味します (カウントは 2 になりますが、実際にはオブジェクトの内部絶対数について考える必要はありません。所有)。

いずれにせよ、プールは引き続き送信releaseされますが、(送信によって取得した所有権の主張を解放していない場合retain)、この解放自体では参照カウントが 0 にドロップされないため、オブジェクトは破棄されません。

を送信したためrelease、請求を放棄したことになり、自動解放プールがその所有権を処理しますが、後で、送信時に正しくなくrelease、イメージの破壊につながります。

要するに、いいえ、を送信releaseしても、自動解放プールのアクションは変更されません。それはまだオブジェクトを所有しておりrelease、実行ループの最後に送信しています。

于 2012-09-10T16:40:50.030 に答える