0

バックグラウンドプロセスを起動するために使用したいセレクターを次のように呼び出しています

[self performSelectorInBackground:@selector(startSync) withObject:nil];

たとえば、startSync が次のようになっているとします。

-(void)startSync {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // expensive background process
    Sync *sync = [Sync new];
    [sync performSync];
    [sync release];
    [pool release];
}

同期オブジェクトの「performSync」では、非常に集中的な処理が行われています。XML を取得し、配列に解析して、MySQL データベースに挿入します。プロセス自体は正常に動作しているようで、Analyzer はリークを示していませんが、プロファイラーを使用して実行前にベースライン ヒープ マークを実行し、実行後に再度実行すると、約 5 MB の増加が見られます。私たちの知る限り (しゃれは意図していません)、私たちは performSync プロセスでオブジェクトを適切に割り当てて解放しています。

問題は、このプロセスをバックグラウンドで実行していることです。AutoreleasePool を作成し、バックグラウンド プロセスの最後にそれを解放している場合、バックグラウンド プロセスが終了したときにバックグラウンド プロセスに関連するすべてを解放すべきではありませんか? 割り当てられたすべてのオブジェクトが破棄されない理由がよくわかりません。

4

2 に答える 2

0

レコードを挿入するたびに close database ステートメントが欠落していたため、より多くの接続が作成され、問題が発生していました。その後、ベースライン ヒープ マークは 1.22mb で、終了ヒープ マークは予想どおり 1.22mb でした。

于 2012-09-19T16:16:29.920 に答える
0

リリースは、イベント ループの最後にのみ発生します。

于 2012-09-18T18:10:31.233 に答える