2

私はiOSアプリでいくつかのシミュレーション計算をしようとしましたが、私の電話は時間の経過とともにメモリ不足になり、メモリ使用量の追加を停止しません。これがどこで発生するかはわかっていますが(Instrumentsでそれを釘付けにしました)、私はまだ知りませんメモリリークを止めるために何を変更する必要があるのか​​ わかりません。

ここにメモリ割り当てが行われる方法があります。ここに新しいデータを追加していることはわかっていますが、ARC は割り当てられたすべてのデータを解放すると思いましたが、これ以上参照できませんか?

int round = 0;

InstanceInSimulation *simulatingChosen = [[InstanceInSimulation alloc] initWithSimulationInstance:_chosenInstance];
InstanceInSimulation *simulatingOpponent = [[InstanceInSimulation alloc] initWithSimulationInstance:_opponentInstance];

while (round < _maxRounds) {

    // first choose action
    NSManagedObject *chosensAction = [simulatingChosen nextActionAgainstOpponent:simulatingOpponent];
    NSManagedObject *opponentsAction = [simulatingOpponent nextActionAgainstOpponent:simulatingChosen];

    // second calculate which action first
    InstanceInSimulation *attackingFirst;
    InstanceInSimulation *defendingFirst;
    NSManagedObject *attackingFirstsAction;
    NSManagedObject *defendingFirstsAction;

    if (simulatingChosen.instance.speed > simulatingOpponent.instance.speed) {
        attackingFirst = simulatingChosen;
        defendingFirst = simulatingOpponent;
        attackingFirstsAction = chosensAction;
        defendingFirstsAction = opponentsAction;
    } else {
        attackingFirst = simulatingOpponent;
        defendingFirst = simulatingChosen;
        attackingFirstsAction = opponentsAction;
        defendingFirstsAction = chosensAction;
    }

    // memory savings
    chosensAction = nil;
    opponentsAction = nil;

    // third calculate
    [self calculateSomething]; // this is not the memory problem

    // memory savings
    attackingFirst = nil;
    attackingFirstsAction = nil;
    defendingFirst = nil;
    defendingFirstsAction = nil;

    round++;
}

// memory savings
simulatingChosen = nil;
simulatingOpponent = nil;

__弱いことをする必要がありますか? 方法がわかりません、誰か助けてくれませんか?

4

2 に答える 2

5

これが役立つかどうかはわかりませんが、試してみる価値はあります。ループ内に autoreleasepool を入れてみてください。

while (round < _maxRounds) {

    @autoreleasepool
    {
    ...
    }
}
于 2013-07-14T22:19:38.440 に答える
1

あなたが見ているのはメモリリークではなく、蓄積されているメモリはまだ自動解放プールによって参照されています。while ループで自動解放されたオブジェクトを作成していますが、自動解放プールが空になることはありません。

Ahmed が提案したように、ループ内に新しい autorelease プールを作成します。

while (round < _maxRounds) {
    @autoreleasepool {
         // your code here
    }
}

Advanced Memory Management Programming Guide のUsing Autorelease Pool Blocksを参照してください。

于 2013-07-14T23:51:23.747 に答える