0

私はdispatch_asyncを使用する関数を持っています:

- (IBAction)action:(id)sender {
    int i=10000;
    NSString * data;
    dispatch_queue_t queue = dispatch_queue_create("com.wang.queue", NULL);
    __weak ViewController*  weakSelf = self;
    while(i>0)
    {
        @autoreleasepool {
            data = [[NSString alloc]initWithFormat:@"%i",i];
            NSString * str = data;
            dispatch_async(queue, ^{{
                [weakSelf print:str];
            }});
            i--;
        }
    }
}


-(void) print:(NSString*)str
{
    NSLog(@"%@",str);
    str = nil;
}

そして、ボタンを5回連続で押します。それが完全に実行された後、メモリは減少しませんでした。そこで、Instrument を使用して、メモリが占​​有されている場所を分析します。このように:</p>

img.bbs.csdn.net/upload/201411/19/1416403576_473540.png

「データ」のメモリが解放されたことが示されました。メモリを占有していたのは「VM:パフォーマンスツールデータ」です。詳細は次のとおりです。

img.bbs.csdn.net/upload/201411/19/1416403630_487530.png

「dispatch_async」に関する何かが解放されなかったと思います。

記憶がこのように機能する理由を誰が教えてくれますか? 感謝 !

4

1 に答える 1

1

いくつかの考え:

  1. オブジェクトを使用していますが、この種の分析をゆがめる可能性NSStringのあるあらゆる種類のキャッシュ/最適化があります。通常、オブジェクトNSStringを使用してメモリ分析を行う場合は注意が必要です。またはいくつかのカスタムクラスNSStringでこれを繰り返すことができます。NSObjectここで問題があるとは思いませんが、メモリ割り当てをデバッグするときに常に認識しておくべきことです。

  2. 使用して@autoreleasepoolいますが、自動解放オブジェクトがありません。注意のためにそのプールを入れたと思いますが、メインdata/strオブジェクトは自動解放されないため、このプールはおそらく何も購入しません。また、参考までに、とにかく、GCD は独自の自動解放プールを採用しています。

  3. autoreleaseオブジェクトがあったとしても、data変数はあなたのスコープ外で定義されて@autoreleasepoolおり、プール内の最終的な強い参照を決して排除していないため、プールは何も達成しません。変数には、可能な限り狭いスコープを使用する必要があります。この場合、data変数を廃止して、ローカルstr変数を使用するだけです。

  4. 保持サイクル (別名、強力な参照サイクル) があるかもしれないことが示唆されました。少なくともこれまでに共有したコードには、そのようなサイクルはありません。

  5. そうは言っても、「パフォーマンス ツール データ」は、作成している 10,000 個のオブジェクトとは無関係に思えます。180 MB を占める 347 個のオブジェクトがあります。

    この「パフォーマンス データ」は、Instruments 自体が作成しているものなのだろうか (たとえば、スナップショット、スタック トレースなど)。私はいくつかの実験を行いましたが、あなたが説明した動作を再現できませんでした. Xcode スキームを変更して、一連のログ オプション (ゾンビ、メモリ チェック、ログなど) を有効にしようとしました。Instruments を変更して、最大量の情報を記録しようとしました (頻繁なスナップショットなど、破棄し続ける)。アイテム、参照カウントの記録など)。これはすべて無駄でした。

    おそらく、どのインストゥルメント設定をオンにしたかを共有できます(またはいくつかオフにしてみてください)。アプリのスキームも同様です (不要なログをオフにしていることを確認してください)。また、質問を編集して、使用している Xcode/Instruments のバージョンやターゲット OS のバージョンなどの詳細をお知らせください。

于 2014-11-22T16:52:31.613 に答える