1

私は客観的 c の初心者であり、私に属していないオブジェクトを解放することがなぜ悪い考えなのか理解できません。

と呼ばれるメソッドにこれがあるとしましょうEurope

//initForStringTheory is a class init method;
Collider *LHC = [Collider initForStringTheory]; 

//Colliders is a NSMutableArray
[Colliders addObject: LHC]  

[LHC release]

を所有していないため、リリースLHCしないことをお勧めします。それへのポインタしかありません。したがって、自動解放プールを有効に活用して、EuropeEuropeLHC

//newCollider is a pointer for the newly created instance in initForStringTheory
return [newCollider autorelease]; 

initForStringTheory。しかし、なぜ?

ポインターEuropeもインスタンスを指していませんか? init メソッドで自動解放を返す代わりに、LHC単に解放できないのはなぜですか?EuropenewCollider

4

2 に答える 2

1

Stavash は基本的に、メソッドを解放するかどうかは、メソッドが保持インスタンスを返したかどうかに依存することを説明しました。

ただし、メモリ管理を正しく使用するために、メソッドが何をするかを知る必要はありません。Cocoa MRC メモリ管理は、メソッドの名前に基づいて、メソッドが何をするかについての規則に従います。規則に従って、名前がallocretainnewcopy、またはで始まるメソッドmutableCopyは保持されたインスタンスを返し、呼び出し元はそれを解放する責任があります。他のすべての名前を持つメソッドは、保持されていないインスタンスを返すため、呼び出し元はそれを解放してはなりません。

したがって、ルールに適切に従っていると仮定すると (もちろん、それは大きな仮定です) initForStringTheory、保持インスタンスを返すべきではありません (必ずしもautoreleased であるという意味ではありません。他の何かによって保持され、単に直接返される可能性があります)。

問題のもう 1 つの部分は、という名前のクラス メソッドinit...を持つことが非常に型破りであることです。通常、 で始まるインスタンス メソッドはコンストラクターであり、インスタンスを作成しinitた の結果に対してすぐに実行されます。allocという名前のクラス メソッドは一体何をするのinit...でしょうか。initまた、慣例により、メソッドには、 によって返された保持されたインスタンスを「消費」しalloc、(必ずしも同じではない) 保持されたインスタンスを返すという特別な規則があります。しかし、それがクラスで呼び出されるこのケースにどのように適用されるのでしょうか? クラスオブジェクトの保持カウントを「消費」し(何もしません)、保持されたインスタンスを返しますか?誰も知らない。

結論として、このコードは本当に書き直す必要があります。という名前のクラスメソッドは絶対にありませんinit...。また、作成するすべてのメソッドに、名前に基づいて規則に正しく従うメモリ管理動作があることを確認してください。

于 2013-01-04T20:08:23.583 に答える
0

initForStringTheory何を返すかはすべて問題です。これが[NSArray arrayWithObjects...]またはなどの便利な初期化メソッドである場合、コレクションに追加した後に解放する必要のない自動解放[NSString stringWithFormat...]されたインスタンスが作成されます。ただし、これが初期化された自動解放されていないインスタンスを返す初期化である場合は、メソッドをコレクションに追加した直後に、メソッド内のローカル インスタンス定義を解放する必要があります。

オブジェクトの保持カウントは、追加時に 1 ずつ増加するため、インスタンス化後に解放/自動解放していないため、2 にはしたくありません (オブジェクトの割り当てが解除されることはないため、メモリ リークが発生します)。 、配列外であっても)。

これを読んでください: http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html

于 2013-01-04T10:35:20.613 に答える