6

私は 2 年前に巨大な iPad アプリを書きましたが、今はそれに戻って iOS5 にアップグレードしています。初めての大規模な iPad アプリだったので、少し面倒です。

これには数分間続く「同期」ステップがあり、これらは URL から JSON をフェッチしてコア データに入れる一連の非同期メソッド呼び出しです。かなり頻繁に、アプリがフリーズします (UI が応答しなくなります)。

この凍結を追跡するための良いテクニックは何ですか? コードがメイン スレッドで実行されていない限り、使用可能なスタック トレースがないため、デバッガーはあまり役に立ちません。多くの場合、アプリはどちらも回復しません。これは、ある種のデッドロック状況を示唆しています。

役立つ可能性のある特定の例を次に示します。

ここに画像の説明を入力

フリーズしていることを確認したら、実行を一時停止しました。毎回同じ行でフリーズしているようです - 簡単な割り当てです。ここで何が起こっているのですか?とてもイライラします。

これは、これを引き起こしているコアデータアクセスですか? 任意のポインタをいただければ幸いです。

編集 2012 年 6 月 29 日

コア データ オブジェクトのすべての作成/更新/削除を行うクラスのソースを表示するには、ここをクリックしてください。このアプリのフリーズ/クラッシュを止める必要があります。私はそれが混乱していることを知っています、それは私もうんざりさせます。私はこれを 2 年前に書きましたが、objective-c についてほとんど知識がありませんでした。書き直す必要がありますが、これを機能させて2日で頭から離さなければなりません。このスレッドセーフをすばやく取得するためのアプローチについて、誰かが私に指針を与えることができますか? NSManagedObjectContext を更新する各メソッドをグランド セントラル ディスパッチ ブロック コードでラップできますか?

4

2 に答える 2

2

Core Data (マルチスレッドと組み合わせて) が問題の原因である可能性は確かにあります - 私も同様の問題を経験しました。

このトピックに関する優れた記事は次のとおりです。コアデータとスレッド、頭痛のないもの

performSelector:スタック トレースに への呼び出しも表示されます。あなたのケースでは書き直すのが大変かもしれませんが、Grand Central Dispatch の使用を検討したいかもしれません。

実際の質問 (デッドロックの追跡) については、Instruments も使用することをお勧めします。また、他のスレッドのステータスも確認してください。

于 2012-06-28T12:32:06.937 に答える
0

あなたが言った:

コードがメインスレッドで実行されていない限り、使用可能なスタックトレースがないため、デバッガーはそれほど役に立ちません。

これは正しくありません。すべてのスレッドのスタック トレースを取得します。

毎回同じ行でフリーズするという事実は、その行に何か問題があることを示唆しています。これはあなたがしていることです:

self.friendObj.affiliations = friendObject1.affiliations;

そのため、その行にブレークポイントを設定し、Xcode がブレークポイントで停止したら、friendObj1. ファンキーな何かが起こっているのかもしれません。

friendObj のクラスにカスタムの "setAffiliations:" メソッドはありますか? その行でなぜか無限ループが発生しているのかもしれません。

あなたのfriendObjの「affiliations」プロパティの設定に関するすべての呼び出しを分析し、バグがどこにあるかを判断しようとします。

別の考え: friendObj は Core Data オブジェクトですか? その場合は、ManagedObjectContext で初期化する必要があります。

于 2012-06-29T00:13:58.027 に答える