2

ここで説明されている手法を使用して、アプリのメモリ使用量を監視し始めました: プログラムで iPhone のメモリ使用量を取得します。

私はそれを試すために3つのテストを書きましたが、これが私が見つけたものです:

- (void)test1 {
for (int i = 0; i < 1000; i++) {
    NSMutableString *str = [NSMutableString stringWithString:@""];
    for (int j = 0; j < 1000; j++) {
        [str appendString:@"some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string "];
    }
}    

- (void)test2 {
for (int i = 0; i < 100000; i++) {
    @autoreleasepool {
        NSString *stri = @"";
        stri = [NSString stringWithFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
    }
}


- (void)test3 {
NSString *str = @"";
for (int i = 0; i < 500; i++) {
    str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
}

test1 または test3 を呼び出すと、メモリが適切に割り当てられ、割り当てが解除されます - 上記のリンクで説明されている report_memory 関数を使用して確認できます。しかし、test2 を呼び出すと、メモリの割り当てが解除されません。report_memory がどんどん増えていきます。test2 を数回呼び出すと、アプリがメモリ警告を受け取り、終了します。

ARCを使用しています。ここで何が起こっているのか誰か説明できますか?

4

3 に答える 3

1

ばっちり成功!!!Zombie オブジェクトを有効にして忘れていたため、@autoreleasepool ブロッ​​クを使用していても、割り当てられたオブジェクトの割り当てが解除されませんでした。

于 2012-09-26T11:25:22.917 に答える
1

stringWithFormat は、自動解放される NSString オブジェクトを返します。したがって、このスレッドの最後で自動解放プールが解放されると、オブジェクトは解放されます。

于 2012-09-24T09:41:35.440 に答える
0

これは、反復ごとに個別の自動リリース インスタンスを使用しているためです。最初のケースでは、呼び出された単一のオブジェクトがstrあり、同じインスタンスに追加しています。そのため、そこでメモリがリークしていません。

このように呼び出しを変更して確認してみてください。

- (void)test2 
{
    NSString *str = @"";
    for (int i = 0; i < 100000; i++) 
    {
       str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i];
    }
}
于 2012-09-24T09:40:28.683 に答える