同じ問題がありました。私の問題はキャッシュ以外の何かに起因しているように見えましたが、SDWebImageキャッシュがメモリの蓄積に寄与していたので、最初に考えたのは、キャッシュが問題の原因である可能性があるということでした. しかし、そうではありませんでした。同じような問題を抱えている可能性があります。私はARCを使用していることに注意してください。
- テンプレートを使用してプロファイラーを実行し、
Leaksで独自のクラスの割り当てを確認しますAllocation Summary。
- リークがある場合は、それらに飛び込んで、それらがどのように割り当てられているかを確認してください。
LeaksARC を使用しているため、機器にリークが表示されないことに注意してください。そのため、Instruments はすべてが順調に進んでいると考えることができますが、それでもどこかにリークがある可能性があります。独自のクラスの割り当てに飛び込むことで、何が問題なのかを理解できます。
- 保持/解放カウント情報は、
Leaksテンプレートを使用している間ではなく、テンプレートを使用している場合にのみ提供されることに注意してAllocationsください。
私の問題は、変数に再割り当てせずにブロック内からインスタンス変数と自己を直接参照していたこと__weakです。self がブロック内で使用されると、自動的に ARC によって保持され、解放されないことがあります。弱い参照は、それが起こらないようにします。
たとえば、これは間違っています:
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[self.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
__weak次のような参照を使用して self を呼び出す必要があります。
__weak YourViewControllerClass *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[weakSelf.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
私のアプリは多くのブロックを使用しているため、Leaks計器が検出できなかった大量のリークがありました。それらを修正したところ、メモリの問題はなくなりました。
これが役立つことを願っています。