1

Iphone アプリでいくつかのストレス テストを実行しました。結果は以下のとおりです。心配する必要があるかどうか、心配している場合はどうすればよいかを考えています。

1秒に1回発火するようにタイマーを設定しました。タイマーが起動するたびに、アプリはサーバーに XML データを要求しました。データが到着すると、アプリはデータを解析し、影響を受けたテーブル ビューを再表示しました。数回の試行で、アプリはクラッシュする前にループを平均約 500 回実行しました。

次に、上記のループから解析と再表示の手順を削除しました。今では約800回行くことができます。

何もダウンロードせずに、テーブル ビューを繰り返し再表示するループを設定しました。1回の再表示が完了するとすぐに、次の再表示が始まりました。2601 ループした後、アプリがクラッシュしました。

上記の数値はすべて、ユーザーが実行する可能性が高いものよりも大きくなっています。

また、計測器の下でデバイス上でアプリを実行しようとすると、アプリがまったく長持ちしません。そのため、有用なデータを取得できません。(しかし、上記で詳しく説明したように、楽器がなければかなりの時間がかかります。)

4

1 に答える 1

2

非常に気を遣う必要があると言えます。プログラミングの第一のルールは、ユーザーはあなたが期待することを決してしないということです。

考慮事項:

  • アクセサー メソッド。それらを使用します。すべての属性のプロパティを設定し、常に適切な getter/setter メソッドを使用してそれらにアクセスします。

.

object.property = some_other_object;      -OR-
[object setProperty:some_other_object];

object = some_other_object.some_property;
object = [some_other_object some_property];

次のような誘惑に抵抗してください。

property = some_other_object;
[property retain];
  • ObjectAlloc から出力を取得しますか? メモリ リーク、パフォーマンス、オブジェクト割り当てから 4 つのツールがあります。それらのどれもロードされていませんか?
  • アプリがクラッシュすると何が得られますか? EXEC_BAD_ACCESS またはその他のエラー?
  • バランスの取れた保持 (割り当てまたはコピー) と解放。すべての alloc/copy と release/autorelease のバランスを同じ方法で維持することをお勧めします。アクセサーを常に使用している場合、手動でリリースする必要はほとんどありません。
  • 多くの場合、自動リリースは実際の問題を隠します。Autorelease によって、いくつかのトリッキーな割り当ての問題が隠される可能性があります。autorelease の使用を再確認してください。

編集済み(障害コードに基づいて追加)上記の「プログラム受信信号:0」の回答に基づいています。これは、メモリが不足していることを示しています。あなたのコードが次のようなことをするインスタンスを探すことから始めます。

myObject = [[MyClass alloc] init];
[someMutableArray addObject:myObject];

新しいオブジェクトを配列に入れるときに「リリース」がありません。その後、この配列が解放されると、オブジェクト myObject は孤立しますが、とにかくメモリ内に残ります。これを行う簡単な方法は、すべての「alloc」/「copy」メッセージを grep することです。非常にまれな状況を除いて、同じ関数内に "release""/autorelease" のペアが必要です。多くの場合、上記は次のようになります。

myObject = [[[MyClass alloc] init] autorelease];
[someMutableArray addObject:myObject];
于 2010-02-26T05:49:04.223 に答える