0

私はobjective-cの初心者で、プログラミングを始めたとき、オブジェクトを適切に解放する方法を本当に理解していませんでした。したがって、私のプロジェクトは Objective-c の世界への導入であるため、完全に省略しました。しかし、今となっては、このプロジェクトは、そのままにしておくのはもったいないという点で進化したと思います。したがって、すべてのallocs、copys、およびnews は別として、プロジェクトがまだ大量のメモリをリークしている理由を理解するのに深刻な問題があります。

Instruments のリーク ツールを使用しました (スクリーンショットを参照)。リークされたオブジェクトの配列全体が表示されます。私の質問: これは心配すべきことですか、それともこれらのオブジェクトはいつかリリースされますか? そうでない場合、どうすればリークの原因を見つけることができますか? cmd + e を押すと拡張詳細ウィンドウが表示されることはわかっていますが、これらの方法のどれを調べる必要がありますか? 開かなければならないのは私自身の方法だと思いますが、ほとんどの場合、レイヤーの割り当てと初期化が問題の原因であると言われています。

とはいえ、リークを効果的に検出する方法を知りたいです。leaksインストゥルメントのバーを見ると、ゲーム レイヤーの初期化時に ( HelloWorldLayer)、biiiig の赤い線が表示されます。ただし、これは初期化時のみです...だから、これについて心配する必要はありますか?

これがスクリーンショットです: ファイルへのリンク (拡大するため) -> http://i.stack.imgur.com/QXgc3.jpg

ここに画像の説明を入力

編集:
いくつかのリークを解決しましたが、今ではよくわからない別のリークがあります:

for (int i = 1; i<=18; i++) {
            NSMutableDictionary *statsCopy = (NSMutableDictionary *)CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)stats, kCFPropertyListMutableContainers);
            NSNumber *setDone = [num copy];
            [levels setObject:statsCopy forKey:[NSString stringWithFormat:@"level%d", i]];
            [levels setObject:setDone forKey:@"setDone"];
            [statsCopy release];
            [setDone release];
        }

私がリリースしたにもかかわらず、彼はたまたまディープ コピーのリークを検出しました...

4

1 に答える 1

1

-[Categories init]スクリーンショットは、解放されない辞書が割り当てられていることを示しています。実際、そのような辞書はたくさん (2765) あります。

そのメソッドは を呼び出しているよう-[NSDictionary newWithContentsOf:immutable:]です。ここでのスタック トレースは、Cocoa 内部の最適化により誤解を招く可能性があります。それはパブリックメソッドではありません。NSDictionaryおそらく、サブルーチン呼び出しではなくジャンプに最適化された末尾呼び出しを持つ別のメソッドによって呼び出されます。

利用可能なデバッグ情報があると仮定すると-[Categories init]、スタック トレースでその行をダブルクリックすると、Instruments は正確な行を表示するはずです。

それがどこに割り当てられているかを知ることは、すべてではありません。クラスは、オブジェクトのCategories所有権を正しく管理できます。ただし、他のクラスがそれにアクセスして、過剰に保持したり、解放しすぎたりする可能性があります。そのため、これらのオブジェクトのいずれかの保持と解放の全履歴を追跡して、どのクラスが所有権を取得し、解放を怠ったかを確認する必要がある場合があります。これは、辞書の内部で使用された malloc ブロックの 1 つではなく、リークされた辞書の 1 つに対して実行する必要があることに注意してください。いくつかの有望な候補については、表の 2 行下に移動してください。特定のオブジェクトを表示するには、その行を切り替えて開きます。いずれかをダブルクリックするか、そのアドレスの横にある丸で囲まれた矢印ボタン (どちらか忘れました) をクリックして、保持と解放の履歴を表示します。

于 2012-05-27T10:36:42.473 に答える