同様の質問が何度も寄せられていることは承知していますが、役立つ回答が見つからないようですので、ご容赦ください。
アプリケーションにリークがあり、気が狂いそうになります。実際、それらは Leaks を使用したリークとして報告されていませんが、ObjectAlloc の正味のバイト数は増加し続け、停止することはありません。これが十分に長く続くと (それほど長くはありません)、最終的にクラッシュにつながります。
この問題は、NSMutableStrings で発生します。それらについて理解できない基本的な何かがあると思います。または、追跡が困難であるがNSMutableStringsの背後に隠れているという別の問題に直面しています。具体的には、NSMutableString に追加または置換を実行するたびに、NSMutableString のサイズを変更するときに、ObjectAlloc がバックグラウンドで malloc/free の不一致のように見えるものを報告することに気付きました。申し訳ありませんが、この問題に直面するのはこれで 2 回目です。最初は何時間も何時間もいじり、最終的に問題はなくなりました (魔法のように!) が、その理由はよくわかりません。
以下のコードを見ると (信じてください、何時間もじっと見つめていました)、問題がわかりません。私はコードを見て、自分が担当する唯一のオブジェクト (aString) を解放しているので問題なく、サイズ変更後に NSMutableString がクリーンアップを処理する必要があると考えています。2 番目の例では、役立つ場合に備えて、渡された文字列は ASIHTTPRequest オブジェクト (responseString) から取得されており、私はそれに対して何もしていません。([self DoStuff2:[request responseString]]) のように単純に呼び出されており、自分でリクエストを解放していません (私は ASINetworkQueue を使用しており、リクエストが破棄されていると想定しています (私は試行してエラーを引き起こしました)リクエストはすでに別の場所でリリースされているためです)。
また、何もすべきではないことはわかっていますが、コードを自動解放プールにラップしようとしましたが、もちろん何もしませんでした。このコードは NSOperation 内で実行されていることに注意してください。NSOperations が自分用に自動解放プールを作成する必要があるため、おそらく問題が発生していると思いましたが、それを試してみましたが、役に立ちませんでした。
NSMutableString とは関係ありませんが、NSString componentsSeparatedByString メソッドを使用しても同様の問題があることがわかりました。分離されたコンポーネントを取得する配列によって使用されるメモリが解放されないことがあります。うーん...一般的に文字列は、私にとってはやや問題があるようです。
誰でも提供できるヘルプをいただければ幸いです。さらに情報が必要な場合は、喜んで追加します。私はこの問題 (および他の問題) に何週間も苦労してきましたが、遭遇するすべての問題について、解決策が見つかるまで懸命に調査したことをお約束します。私は非常に多くのコードを書いてきましたが、今はいくつかの小さなリークなどを封印しようとしていますが、この問題に気づきました。正直なところ、Objective C でのメモリ管理が私を困惑させることがあるとは信じられません... 私は Apple のメモリ管理ドキュメントを何度も読み、それを完全に理解していると思っていました。本当に理解しているのだろうか…と思うことがあります。
繰り返しますが、誰かが洞察を持っているなら、私は感謝します。あなたの時間と努力に感謝します。
-(void)DoStuff
{
NSString *aString [ [[NSString alloc] initWithFormat:@"text %@ more text", self.strVariable];
[self.someMutableStringVar replaceOccurrencesOfString:@"replace" withString:aString options:NSCaseInsensitiveSearch range:NSMakeRange(0, [self.someMutableStringVar length])];
[aString release];
}
-(void)DoStuff2:(NSString *)aString
{
[self.someMutableStringVar appendString:aString];
}