1

私はアプリを開発しましたが、現在はInstrumentsを使用してメモリ使用量を確認しています。オブジェクトの保持/解放プロセスを理解するのに問題があります。これはインスツルメンツが言うことです:

オブジェクトを配列に追加するとき、ビューにオブジェクトを追加するとき、および配列から離すと、保持カウントが増加します。したがって、オブジェクトを使用するremoveFromSuperviewと、オブジェクトretainCountがゼロになることはないため、オブジェクトはメモリを解放しません。

編集1:私はARCを使用していると言うのを忘れました。

編集2:私は何が起こるかを正確に説明します:私はオブジェクトをと呼ばれるクラスの他のオブジェクトと一緒に作成しますNKLevelGenerator。その中にsを割り当ててから、返されるNKIngredientaにすべてを追加します。NSArrayここで、すべてのオブジェクトの保持数は2です。私のNKLevelVC、私のViewController、私はこの命令を使用します:

[level addObjectsFromArray:[levelGenerator level1WithDelegate:self ciotola:ciotola bagliore:bagliore difficulty:NKDifficultyHard]];

オブジェクトlevelNSMutableArrayそのiallocinitinviewDidLoadです。ここから、この操作を実行する別のメソッドを呼び出します。

- (void)insertInArrayRandomly {
    for (int i=0; i<[level count]; i++) {
        [ingredienti insertObject:[level objectAtIndex:[[indexes objectAtIndex:i]integerValue]] atIndex:i];
    }
}

オブジェクトは私とingredientiの別のものです。オブジェクトをランダムに抽出するためのランダムインデックスを含む配列です。それから私はこれをやっています:NSMutableArrayallocinitviewDidLoadindexesNSIntegerNKIngredient

NKIngredient *ing = [ingredienti objectAtIndex:index];
[[self view] insertSubview:ing belowSubview:navBar];
[ing animateIngredient];
[ingredienti removeObject:ing];
4

2 に答える 2

1

Instrumentsを調べる前に、コードの静的分析を試しましたか?単純なメモリの問題に役立つ場合があります。

しかし、最初に確認することは、次のとおりです。黄金律に従いましたか?

黄金律は次のとおりです。、、allocまたはcopy1retainつだけを使用する必要があります、releaseまたはautorelease

これは、ARCを使用しないメモリ管理の最も重要なルールです。したがって、オブジェクトが配列によって保持されるという事実はあなたの仕事ではありません。保持、割り当て、またはコピーしたものを覚えて、それを解放してください。

PS:次回は、Instrumentsのスクリーンショットよりもコードの方がはるかに役立ちます。

于 2012-12-19T10:36:40.343 に答える
0

まず、機器を使用して、メモリリークが効果的に発生しているかどうかを確認します。この目的のために作成されたツールがあり、メモリリークが発生した場所を示します。2番目:ビュー上に[保持]されたオブジェクトの数によって異なります。配列に追加すると、ビューは保持されますが、ビューを作成するメソッドで解放しない場合、配列からビューを解放すると、カウントは1のままになります。

于 2012-12-19T10:34:48.447 に答える