1

の使い方がよくわかりませんautorelease;

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
RetainTracker* tracker = [RetainTracker new];
[tracker retain];
[tracker retain];
[tracker autorelease];
[pool release];

上記のコードにメモリリークはありますか?

の参照カウントを変更せずに、にautorelease入れるだけであることは知っています。を呼び出すと、オブジェクトは 1 つのメッセージを受け取り、次に の参照カウントはです。そのため、コンパイラは object の関数を呼び出すことができないため、メモリ リークが発生します。trackerNSAutoreleasePooltracker[pool release]releasetracker2dealloctracker

だから私はこれを取得します:私たちは同時に電話する必要がretainありreleaseます、それは正しいですか?

4

2 に答える 2

4

Objective-c を初めて使用する場合は、自動参照カウントを使用する必要があります。ほとんどの人がそうすべきです。しかし、理解のために:

オブジェクトには、それを参照しているオブジェクトの数の参照カウントがあります。ゼロになると、オブジェクトは何からも参照されなくなり、割り当てが解除されます。Objective-C のすべてのメソッドは、保持しているオブジェクトを解放する責任があります。問題は、ファクトリ メソッドのジョブがオブジェクトを作成することである場合、保持しているオブジェクトを解放しないことで規則に違反していることです (この例では、オブジェクトが作成されたため保持されています)。releaseオブジェクトを返す直前にメソッドが呼び出された場合、既に存在しないオブジェクトへのアドレスが返されます。そのため、呼び出されたメソッドが作成したオブジェクトを呼び出し元のメソッドが保持できるようになるまで、解放を一時的に遅らせる自動解放があります。

上記の例では、2 つの保持を取り除き、autorelease のみを呼び出した場合、オブジェクトは解放され、自動解放プールが解放されたときに割り当てが解除され、(割り当て解除の直前に) 排出されます。つまり、すべてのオブジェクトで release が呼び出されます。そのプール、トラッカーで autorelease を呼び出すとプールに追加されたため、トラッカーはそれらの1つです。

于 2013-09-08T13:15:53.420 に答える