0

以下のコードでメモリリークはありますか? いいえ、と思いますが、以下のコードはメモリを割り当てますが、解放しません。

どんな助けでも大歓迎です

@autoreleasepool {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    for (int i = 0; i < 300000; i++) {
        @autoreleasepool {
            [dict setObject:[NSNumber numberWithInt:i] forKey:[NSNumber numberWithInt:i]];
        }
    }
    [dict removeAllObjects];
}
4

1 に答える 1

1

これがあなたの問題に影響するかどうかはわかりませんが、知っておく価値はあります...

NSNumber は、特に整数 0 から 12 に対して、舞台裏でいくつかの凝った処理を行います。将来再利用する必要がある可能性が高いと想定しているため、常にそれらを解放するとは限りません。それらは、常に保持/削除したくないほど一般的に使用されていると見なされます。

このディスカッションを参照してください。

これは、メモリが解放されていないことの原因かもしれませんが、大量にはなりません。

上記のコードを for ループに入れて、それを何度も呼び出すとメモリが増加するか、または使用されるメモリの量が一定に保たれるかを確認すると興味深いでしょう。

for (int i = 0; i < 100; i++) {
    @autoreleasepool {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        for (int i = 0; i < 300000; i++) {
            @autoreleasepool {
                [dict setObject:[NSNumber numberWithInt:i] forKey:[NSNumber numberWithInt:i]];
            }
        }
        [dict removeAllObjects];
    }
}

平地ならそこまで気になりません。

于 2013-04-25T02:26:45.120 に答える