1

次のようなコードがあります。

NSObject *var1 = [[NSObject alloc] init];
NSObject *var2 = var1;
[var2 release]; 

var1 = nil;

これは正しいですか、それともメモリリークですか? 私が知る限り、オブジェクト所有権ポリシーに従って、最初の行で割り当てられたメモリを解放できるのは var1 だけです。

4

4 に答える 4

2

単一の割り当てと単一の解放があるため、コードはメモリ解放します-オブジェクトへのポインターの量は要因ではありません。

所有権は、オブジェクト所有権ポリシーで説明されている概念です。ガイドラインに従うと、管理が容易になり、最終的には、リリースしてはいけないものをリリースする (またはリリースする必要があるものをリリースしない) ことに関連する問題を防ぐことができるからです。

于 2011-03-31T10:54:19.780 に答える
0

あなたのコードは大丈夫で、リークしていません。しかし、ポインタを本当に理解していないようです。ポインターは別のオブジェクトを所有することはできません。ポインターは、どのオブジェクトがアクセスされているかをコンピューターに伝える単なる参照です。Cocoa の参照カウント メモリ モデルでは、1 つのオブジェクトを指すポインターの数はまったく問題になりません。

Objective-C を学ぶ前に、C を (特にポインタについて) 学ぶ必要があります。

于 2011-03-31T11:03:07.063 に答える
0

あなたの例では、メモリリークが発生せず、メモリ内の同じオブジェクトvar1var2指しているため、alloc呼び出しには一致するrelease. ただし、NSObjectが割り当てられたまま保持されるvar2と、一致する がないため、メモリ リークが発生しますrelease

メモリ管理ガイドが所有権の概念について述べている場合、それは変数 (例: var1) がオブジェクトを所有していることを意味するものではありません。それは、それを所有する「スコープ」(クラスまたはメソッドなど)に関するものです。あなたの例では、これらのステートメントを含むメソッドがオブジェクトの解放を担当します。

于 2011-03-31T11:01:55.930 に答える
0

オブジェクトへのポインターではなく、参照カウントを保持するのはオブジェクトです。オブジェクトへのポインターが多数ある場合、それらはすべて同じオブジェクトを指しているため、それらのいずれかを使用してオブジェクトを解放できます。ただし、そのようなゲームをプレイしない場合は、コードに従ってメモリ管理の問題が発生していないことを確認する方がはるかに簡単です。

于 2011-03-31T11:09:06.553 に答える