1

ねえ、私はココアタッチの静的ライブラリを作成しています.そして、私はこの問題を抱えています:

Leaks インストゥルメントを使用してシミュレーターでプロジェクトを実行しています。自動解放されたオブジェクトのリークが発生しています。

NSAutoreleasePool私は(私の方法で)一度に少なくとも1つ配置しているという事実を知っていますmain()。私の質問は、他のものをどのくらいの頻度で配置する必要があるかです(それが重要な場合は、iPhoneとiPad用に開発しています)

更新: なんらかの理由で、コードがUIApplicationMain()iOS 4 の呼び出しから終了せず、SIGKILLシグナルを受け取っているだけで、自動解放プールが空になっていないことがわかりました。どうすればそれを修正できますか (アプリが を取得することを意味しますSIGKILL)

ありがとう

4

3 に答える 3

2

NSAutoreleasePoolバックグラウンド スレッドで何かを実行する場合は必須なので、関数をバックグラウンドで実行できる場合は、自動解放プールを作成する必要があります。

- (void) willRunInBackground{
   NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
   ...
   [pool drain];
}

NSAutoreleasePool が役立つ 2 番目の状況は、ループ内で多くの自動解放オブジェクトを作成する場合です。多くの自動解放オブジェクトがぶらぶらするのを避けるために、ループ反復で自動解放プールを作成して排出することができます (Joe が述べたように)。

しかし、メモリ リークは最初の理由によって引き起こされる可能性があります。各スレッドには、自動解放されたオブジェクトを処理するための独自の NSAutoreleasePool が必要です。

于 2010-11-05T12:01:40.577 に答える
1

オブジェクトを自動解放しているという事実自体は、メモリ リークを防止するものではありません。オブジェクトがプール外で自動解放されていることを示すメッセージがコンソールに表示されないため、問題はプールに配置されていないことではないことを示しています。

保持数を適切に管理していない必要があります。-alloc と -copy へのすべての呼び出しは、-release または -autorelease への呼び出しとバランスを取る必要があることに注意してください。おそらく、どこかのクラスの dealloc メソッドでメンバー変数を解放していません。Instruments を使用して、オブジェクトを割り当て/コピーしている場所を見つけることから始めます。次に、保持しているすべての場所を調べて解放し、各オブジェクトの保持カウントのバランスが取れていることを確認します。

于 2010-11-05T22:33:33.430 に答える
0

WWDC のビデオによると、多くの変数が飛び交うタイトなループは、変数を配置するのに適した場所です。ループの前に開始すると、自動解放されるループ内のすべてがそのプールに移動し、後でそれを排出する必要があります。

于 2010-11-05T11:58:26.770 に答える