1

Objective C で何かを計算するプログラムを作成しようとしています。残念ながら、計算することがたくさんあり、プログラムは 10000 回の反復でループを実行しています。合計実行時間は約 5 分です。これは問題ではありませんが、実行中にプログラムが使用するメモリが劇的に (2GB 以上) 増加し、一部の値が解放されていないことが原因であると考えられます。問題をループ内での NSArray の作成に絞り込みました。問題のあるコード (問題に集中するように変更) は次のとおりです。

for (NSInteger k = 0; k<100000; k++) {

    NSMutableArray *mutableTestArray = [NSMutableArray new];
    for (NSInteger i=0; i<200; i++){

        NSMutableArray *subArray = [NSMutableArray new];
        for (NSInteger j=0; j<200; j++) {

            //simplified version, normally the valus for sub array are dependent on some other factors
            [subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];

        }
        [mutableTestArray addObject:subArray];

    }


    //do stuff with mutableTestArray
    //change parameters that go into sub array

}

私が交換した場合:

[subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];

と:

[subArray addObject:@"test"];

それは正常に動作します。だから私はどうにかして私が作成した配列を解放しなければならないと思います。しかし、どのように?ARC を有効にしていますが、ARC が有効になっているかどうかを知る限り、オブジェクトを手動で解放できません。誰かがコードを変更する方法を教えてくれたり、メモリ管理を正しく行う方法を学べる場所を教えてくれたりしてくれたら最高です。

ありがとう

4

2 に答える 2

6

いくつかの autoreleasepools を投入するだけです:

@autoreleasepool {
        NSMutableArray *subArray = [NSMutableArray new];
        for (NSInteger j=0; j<200; j++) {
@autoreleasepool {

            //simplified version, normally the valus for sub array are dependent on some other factors
            [subArray addObject:[NSArray arrayWithObjects:@"test", @"test", nil]];
}
        }
        [mutableTestArray addObject:subArray];

}
于 2012-11-17T13:39:49.587 に答える
5

[NSArray arrayWithObjects:@"test", @"test", nil];自動解放されたオブジェクトで戻り、将来どこかで解放されますが、すぐには解放されません。使用する[[NSArray alloc] initWithObjects:@"test", @"test", nil];と、ARC のため、アレイはすぐに解放されます。ARC を使用しない場合、コードは次のようになります。

NSArray* tempArr = [[NSArray alloc] initWithObjects:@"test", @"test", nil];
// use the temporary variable
[subArray addObject:tempArr];
[tempArr release];

ARC を使用しているため、リリースを削除する必要があります。

于 2012-11-17T13:41:53.980 に答える