/ / Objective Cでの無限ループの処理-Objective-c、ios、メモリリーク

Objective Cの無限ループを扱う - objective-c、ios、memory-leaks

私は最近iPadプロジェクトに参加しました。コードベースを調べてみると、いくつかの変わったことがわかりました。そのうちの1つは次のとおりです(これをメタコーディングしました)。

while (something.isAlwaysTrue) {
// Wait for something to happen. i.e. Get data from an internet connection.
// Respond to something.
}

アプリのメモリプロファイリングを開始し、これらのループが大量のメモリリークを起こしていることがわかるまで、これに関する問題に気づきませんでした。その理由は、ループが終了しないため、 autorelease メソッドが終了せず、自動解放プールが解放される機会がないため、インスタンス内に作成されたインスタンスが解放されることはありません。

コードを書いた開発者と話し合った後、私は次のテクニックを思いつきました。

-(void) queueTask {
// Using GCD or perform with delay, call the process method.
}

-(void) process {

// Wait and/or do stuff.

[self queueTask];
}

基本的な考え方は、GCDまたはrunloopを介してキューイングするメソッドを使用することにより、自動解放プールに実行およびクリーンアップの機会を与えるというものです。 autorelease インスタンス。これは問題なく機能しているようです。

私の質問は-これはこれらのループに対処するための最良の方法ですか?またはそれを行うためのより良い方法はありますか?

回答:

回答№1は8

2つのポイント。

ヒープの増加を最小限に抑える

とにかく、メモリの増加を最小限に抑える方法は次のとおりです。

while (something.isAlwaysTrue) {
NSAutoreleasePool * pool = [NSAutoreleasePool new];
// Wait for something to happen. i.e. Get data from an internet connection.
// Respond to something.
[pool release], pool = 0;
}

または、ブリーディング(原文のまま)エッジを好む場合:

while (something.isAlwaysTrue) {
@autoreleasepool{
// Wait for something to happen. i.e. Get data from an internet connection.
// Respond to something.
}
}

自動解放プールは、スレッドローカルスタックのように動作します。プールをプッシュすると、自動解放されたオブジェクトが現在のスレッドの最上位プールに追加されます。プールをポップすると、プールは release 自動リリースごとのメッセージ。

自動解放プールの代わりにGCDを使用するのは奇妙です。を使用するのと同様 NSArray 単一文字の NSStrings単に単一を使用する必要がある場合 NSString.

マルチスレッドプログラムフロー

無限ループは非常に疑わしいプログラムです。実行ループを再発明しようとしている可能性があることを示しています。もちろん、メインの実行ループは一般的です。セカンダリスレッド1)実行ループがある2)決して終わらないのは珍しいことです。

プログラムがどのように流れるかを再考する必要があります。通常、イベントが完了するまでポーリングして、息を止めるのではなく、イベントに基づいて行動します。あなたはあなたが提案したプログラムでその状況から抜け出そうとしているかもしれません-しかし私は十分な詳細を持っていません。