2

私は次のコードを持っていて、iOSが割り当てられたメモリを再収集しているときに何が起こるのか疑問に思っています。現在は別のメモリを指していますが、メモリp1は後で自動解放されるように指していますか?また、p1は意味的に最初に自動解放されたメモリを指すように意図されているので、メモリp2も自動解放されるように指し示されますか?

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *p2 = [[NSMutableArray alloc] init];

// what will happen to the memory p1 and p2 point to
// after the following assignment, and at later stage?
p1 = p2;
4

5 に答える 5

5

何もリークされません。p1は自動解放されたオブジェクトです。そのシナリオでは、p2をp1に割り当てた後、両方が同じオブジェクトを指しているだけです。p1が指していた元のオブジェクトは、自動解放プールによって管理され、プールが空になると解放されます。ARCであろうとなかろうと、後でp2をリリースすることを前提として、リークはありません。

于 2012-08-14T15:12:46.617 に答える
1

ARCでは、何もする必要はありません。両方のオブジェクトが解放されます。ARCの外部:

NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];

自動解放された値を返します。この値を解放する必要はありません。ただし、これは次のとおりです。

NSMutableArray *p2 = [[NSMutableArray alloc] init];

手動保持カウントは1です。使い終わったら、p2の値(次にp1に割り当てられます)を解放する必要があります。

于 2012-08-14T15:13:10.583 に答える
1
NSMutableArray *p1 = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *p2 = [[NSMutableArray alloc] init];

// what will happen to the memory p1 and p2 point to
// after the following assignment, and at later stage?
p1 = p2;

「iOSは割り当てられたメモリを再収集しています」-iOSにはガベージコレクション機能がありませんでした。

p1は、自動解放されたオブジェクトを指すポインターです。

p2は、自動解放されていないオブジェクトを指すポインタです(メモリリークを回避するために、後で解放する必要があります)。

p1 = p2の後、p1は、p2が指している自動解放されていないオブジェクトを指します。p1が指していた元のオブジェクトは、この時点で孤立しています。

ARC機能を使用している場合は、何もする必要はありません。手動メモリ管理環境では 、所有する割り当てられたオブジェクトの解放を行う[p2 release];か、バランスを取ります。[p1 release];

于 2012-08-14T15:22:27.657 に答える
1

ちなみに、将来このような質問がある場合は、次の方法で簡単にテストできます。(a)問題のクラスをサブクラス化する。(b)dealloc割り当て解除をログに記録する独自のものを追加します。例えば:

@interface TestNSMutableArray : NSMutableArray
@end

@implementation TestNSMutableArray
- (void)dealloc
{
    [super dealloc]; // only needed for non-ARC
    NSLog("%s", __FUNCTION__);
}
@end

TestNSMutableArray次に、ではなくを使用してコードを試してくださいNSMutableArray。あなたがあなたを見ればdealloc、あなたは良いです。そうでなければ、あなたは漏れています。

明らかにInstrumentsも使用できますが、Objective-Cのメモリ処理を最初に手にしたとき、これは単純ですが、便利な診断手法であることがわかりました。

于 2012-08-14T15:29:15.653 に答える
-1

まず、これはARCを使用しているかどうかによって異なります。

ARCの使用:メモリリークは発生しません。OSはp1のメモリを解放し、アレイはp2と同じ場所を指すようになります。次に、OSは、p1とp2がなくなると(クラスの割り当てが解除されるときなど)、両方のアレイのメモリを解放します。

ARCなし:p1がリークします。リークを修正するには、

[p1 release];

p2の値をp1に割り当てる前。クラスの割り当てが解除される前にこれらの配列の両方でreleaseを呼び出さないと、p2からのメモリもリークされます。

于 2012-08-14T15:03:40.533 に答える