ARCでタイトなループの下でメモリ管理を処理するための最良の方法についてもっと知りたいです。特に、私が書いているアプリにはwhile
、非常に長い間ループするループがあり、ARCのベストプラクティス(私が信じていること)を実装したにもかかわらず、ヒープが維持されていることに気づきました。限りなく成長しています。
私が抱えている問題を説明するために、私は最初に次のテストを設定して故意に失敗しました。
while (true) {
NSMutableArray *array = [NSMutableArray arrayWithObject:@"Foo"];
[array addObject:@"bar"]; // do something with it to prevent compiler optimisations from skipping over it entirely
}
このコードを実行し、割り当てツールを使用してプロファイリングすると、メモリ使用量が際限なく増加することがわかります。ただし、これ@autoreleasepool
を次のようにラップすると、問題がすぐに解決され、メモリ使用量が低く抑えられます。
while (true) {
@autoreleasepool {
NSMutableArray *array = [NSMutableArray arrayWithObject:@"Foo"];
[array addObject:@"bar"];
}
}
完全!これはすべて正常に機能しているようです。また、を使用して作成された自動リリースされていないインスタンスでも正常に機能します(予想どおり)[[... alloc] init]
。UIKit
私がクラスに参加し始めるまで、すべてがうまくいきます。
たとえば、を作成してUIButton
、何が起こるかを見てみましょう。
while (true) {
@autoreleasepool {
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectZero;
}
}
現在、メモリ使用量は無限に増加しています。事実上、@autoreleasepool
効果がないように見えます。
したがって、問題は、なぜメモリが正常に機能し、メモリを抑制し続けるのかということですが、ヒープに適用すると、ヒープは成長し続けますか?@autoreleasepool
NSMutableArray
UIButton
最も重要なことは、このような無限ループでクラスを使用するときにヒープが無限に拡張しないようにするにはどうすればよいですか。これにより、ARCinまたはスタイルループUIKit
のベストプラクティスについて何がわかりますか。while(true)
while(keepRunningForALongTime)
これについての私の直感は(そして私は完全に間違っている可能性があります)、おそらくwhile (true)
ランループが循環しないようにする方法についての何かであり、UIKit
インスタンスを解放するのではなくメモリに保持しています...しかし明らかに私は何かが欠けていますARCについての私の理解!
(そして明らかな原因を取り除くために、NSZombiedEnabled
は有効になっていません。)