web-dev-qa-db-ja.com

アプリがフリーズするがエラーは表示されない

アプリがフリーズした場合、何を確認する必要があるかを誰かが知っていますか?つまり、iPad画面にアプリを表示できますが、ボタンが反応しません。ボタンをクリックしたときにコードをデバッグしてみましたが、まだ何も見ていません。 Instrumentsツールについて読んでいました。具体的にはどのように使用しますか?

誰かが私を助けてくれますか?ツールの使い方について説明が必要です。

32
Vanjo

どういうわけかメインスレッドをブロックしているようです。デバッグするには、デバッガーでアプリを実行し、アプリがフリーズしたら、Xcodeの下部にあるログ領域の上にある一時停止ボタンをクリックします。次に、左側で、各スレッドが何を行っているかを正確に確認でき、どこでスタックしているのかを確認できます。

pause button

おそらくメインスレッドの長いループか同期デッドロックのどちらかです。

86
Ben Baron

スタックトレースを一時停止して追跡することに加えて、追加で行うべきこととして、アプリがフリーズする原因となるループがないかコードをチェックインします。

私は最近同様の問題に遭遇しましたが、スタックトレースはあまり役に立たず、layoutsubviewsメソッド内でreloadData()を呼び出すときに永遠のループがあり、エラーなしでフリーズを引き起こしていることがわかりました。楽器からの助けはありません。

1
sheinix

私のプロジェクトでも同様のケースがあり、その理由は、メソッドsetNeedsLayout()内にlayoutSubviews()を追加した別の開発者でした。これにより、無限ループが発生し、アプリがフリーズします。

0

正解は正解です。これは「一時停止」オプションでデバッグできます。メインスレッドをブロックする最も一般的な方法は、ディスパッチする同じスレッドでdispatch_syncを呼び出すことです。 dispatch_onceから同じコードを呼び出すことがあります。

0