「foo」という名前のオブジェクトがあり、「bar」という名前の別のオブジェクトがプロパティとしてあるとします。
「foo」が割り当てを解除すると、「bar」へのすべての参照が自動的に削除され、「bar」も割り当てが解除されますか?または、「foo」の割り当てを解除し、「bar」をメモリのどこかにフロートさせますか?「bar」のすべての参照が「foo」で定義されている場合でも。
前もって感謝します。
「foo」という名前のオブジェクトがあり、「bar」という名前の別のオブジェクトがプロパティとしてあるとします。
「foo」が割り当てを解除すると、「bar」へのすべての参照が自動的に削除され、「bar」も割り当てが解除されますか?または、「foo」の割り当てを解除し、「bar」をメモリのどこかにフロートさせますか?「bar」のすべての参照が「foo」で定義されている場合でも。
前もって感謝します。
foo
オブジェクトに保持またはコピーがある場合(Daveに感謝)、bar
たとえば、プロパティを次のいずれかとして宣言する場合:
@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;
bar
割り当てを解除するときに解放する必要がありますfoo
:
- (void)dealloc
{
[bar release];
[super dealloc];
}
システムはbar
、すべての参照を削除するまで(つまり、参照カウントが0になるまで)、メモリスペースを解放しないため、参照カウントとオブジェクトを自分で監視する必要があります。
メモリを割り当てる場合は、それを解放する必要があります。したがって、はい、[bar release]
またはself.bar = nil
(合成プロパティなどを使用している場合)をに呼び出しますdealloc
。
iOSでのメモリ管理の概要については、こちらをご覧ください。
オブジェクトAは、割り当てが解除されたときに他のオブジェクト(オブジェクトB、オブジェクトCなど)への参照を解放する責任があります。これは自動的には行われません。
これは-dealloc
、オブジェクトのメソッドで行われます。
- (void)dealloc
{
[propertyB release];
[propertyC release];
[super dealloc];
}
(または、プロパティが読み取り/書き込みで作成されているretain
場合は、などに置き換えることができます[self setPropertyB:nil]
)。
したがって、オブジェクトAへのすべての参照がなくなると、割り当てが解除され、プロパティBとCの参照カウントが減少します。これらのオブジェクトがオブジェクトAのみによって所有されている場合、それらのオブジェクトも割り当て解除されます。結果。
(これは、タグ付けしたすべてのiPhone OS開発に当てはまります。ルールと動作が異なり、いくつかのことを自動的に実行するMacのガベージコレクション環境について話しているのではないと思います。)
使用する主な理由self.bar = nil
は、barがnibファイル内に作成されたビューへの参照である場合です。-(void)viewDidUnload
その場合、ビューがシャッフルされたときにシステムがそのオブジェクトを解放できるようにするため、その行をに含めます。ビューが戻ってきた場合は、nibファイルを介して再ロードされます。'self.bar = nil
ただし、これにより、使用または使用[bar release]
する必要がなくなるわけではありません。-(void) dealloc