次のようなコードがあります。
NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release];
var1 = nil;
これは正しいですか、それともメモリリークですか? 私が知る限り、オブジェクト所有権ポリシーに従って、最初の行で割り当てられたメモリを解放できるのは var1 だけです。
次のようなコードがあります。
NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release];
var1 = nil;
これは正しいですか、それともメモリリークですか? 私が知る限り、オブジェクト所有権ポリシーに従って、最初の行で割り当てられたメモリを解放できるのは var1 だけです。
単一の割り当てと単一の解放があるため、コードはメモリを解放します-オブジェクトへのポインターの量は要因ではありません。
所有権は、オブジェクト所有権ポリシーで説明されている概念です。ガイドラインに従うと、管理が容易になり、最終的には、リリースしてはいけないものをリリースする (またはリリースする必要があるものをリリースしない) ことに関連する問題を防ぐことができるからです。
あなたのコードは大丈夫で、リークしていません。しかし、ポインタを本当に理解していないようです。ポインターは別のオブジェクトを所有することはできません。ポインターは、どのオブジェクトがアクセスされているかをコンピューターに伝える単なる参照です。Cocoa の参照カウント メモリ モデルでは、1 つのオブジェクトを指すポインターの数はまったく問題になりません。
Objective-C を学ぶ前に、C を (特にポインタについて) 学ぶ必要があります。
あなたの例では、メモリリークが発生せず、メモリ内の同じオブジェクトvar1
をvar2
指しているため、alloc
呼び出しには一致するrelease
. ただし、NSObject
が割り当てられたまま保持されるvar2
と、一致する がないため、メモリ リークが発生しますrelease
。
メモリ管理ガイドが所有権の概念について述べている場合、それは変数 (例: var1
) がオブジェクトを所有していることを意味するものではありません。それは、それを所有する「スコープ」(クラスまたはメソッドなど)に関するものです。あなたの例では、これらのステートメントを含むメソッドがオブジェクトの解放を担当します。
オブジェクトへのポインターではなく、参照カウントを保持するのはオブジェクトです。オブジェクトへのポインターが多数ある場合、それらはすべて同じオブジェクトを指しているため、それらのいずれかを使用してオブジェクトを解放できます。ただし、そのようなゲームをプレイしない場合は、コードに従ってメモリ管理の問題が発生していないことを確認する方がはるかに簡単です。