0

単純なアルゴリズムを持つ保持/解放プロジェクトがあります。私は 100000 オブジェクトの可変配列で開始し、5 秒間隔ごとに最初に 1000 オブジェクトを削除し、最後に 1000 オブジェクトを追加します。理論的には、メモリ フットプリントはわずかな遅延の後も同じままである必要がありますが、一定量に達するまで一貫して増加します。ただし、「[array removeAllObjects]」ですべてのオブジェクトを削除して配列を解放しても、すべてのメモリが回収されるわけではなく、一部だけが回収されます。デバッガーを使用せずにリリース スキームで実行し、アクティビティ モニターを使用してメモリ使用量を追跡しています。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    array = [[NSMutableArray alloc] init];
    for(int i = 0; i<100000; i++){
        NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
        [array addObject:url];
    }
    self.t = [NSTimer scheduledTimerWithTimeInterval:10  target:self selector:@selector(addAndRemove:) userInfo:nil repeats:YES];

}

-(IBAction)addAndRemove:(id)sender{
     [array removeObjectsInRange:NSMakeRange(0, 1000)];

     for(int i = 0; i<1000; i++){
        NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
        [array addObject:url];
     }
}

-(IBAction)clear:(id)sender {
    [array removeAllObjects];    
    [array release];
    [t invalidate];
    t = nil;
}
4

2 に答える 2

3

を使用して NSURL を作成するとき

NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];

Autoreleased オブジェクトを作成しています。自動解放されたオブジェクトは自動解放プールに格納され、そのプールが空になったときにのみ破棄されます。メインプールは、メインの実行ループが起動すると 60 秒ごとにフラッシュされるため、オブジェクトが予想よりも遅く解放される可能性があります。

for ループを @autoreleasepool { } ブロックでラップして、ループ内で作成された自動解放されたオブジェクトがすぐにフラッシュされるようにするか、自動解放されないように alloc/init を使用して NSURL を作成します。

NSURL *url = [[NSURL alloc] initWithString:@"http://www.apple.com"];

次に、メモリ使用量が変わるかどうかを確認します。

于 2012-04-18T22:46:20.367 に答える
3

アクティビティ モニターでメモリ使用量を監視することは、かなり信頼できません。まず、どのメモリ フィールドを監視していますか (仮想プライベート メモリ、リアル プライベート メモリ、リアル共有メモリ、またはリアル メモリ)。

第 2 に、コードが割り当て要求を行う場合、通常、それは直接的または間接的に malloc ルーチンに送られます。malloc ルーチンは、既にあるメモリから要求を満たそうとします。それができない場合は、システムからさらに要求します。メモリを解放すると、malloc に戻ります。Malloc は必ずしもそれをシステムに返すわけではありません。将来のリクエストをより迅速に満たすために、それを保持する場合があります。そのため、プログラムが割り当てられたすべてのものを解放している場合でも、プロセスのメモリ使用量が少なくとも完全に減少するわけではありません。

プログラムがメモリを正しく管理していることを確認する適切な方法は、Instruments を Leaks and Allocations ツールと共に使用することです。

于 2012-04-18T23:00:32.767 に答える