3

しばらくの間製品化されていたアプリがありますが、iOS 7 では、アプリを少し操作した後、遷移に顕著な遅延があります。時間プロファイラーを使用して時間がかかっていることを確認しcache_eraseImp_nolockましたが、それが原因のようです。(以上の時間がかかっていobjc_msgSendます!) ビューコントローラ遷移時に呼び出されるようです。(View Controller のプッシュ、モーダル View Controller の提示など)

誰かが似たようなものを見ましたか?この問題を防ぐにはどうすればよいですか?

ゼロから構築したアプリでこの問題を再現しようとしていますが、今のところうまくいきません。

楽器のスクリーンショット

4

3 に答える 3

5

UIAppearance は、iOS7.0.x で非常に遅いです。上記のスタック トレースによると、外観メソッドを適用すると、毎回 (または少なくとも何度も) method_exchangeImplementations() が呼び出され、ターゲット クラスとすべてのサブクラスの ObjC ランタイムのキャッシュをクリアする必要があるように見えます。それをしている間、グローバルロックを保持します-非常に遅いです。UIAppearance が変更されたのか、それとも ObjC ランタイムに変更があったため、このケースが以前よりも病的に遅くなったのかはわかりません。

さらに、UILabel の setShadowOffset: メソッドと setShadowColor: メソッドも非常に遅いことがわかりました。これは、外観が変更されたバージョンのように見え、同じ問題があるためです (UI_APPEARANCE_SELECTOR というラベルが付いていないにもかかわらず)。

全体的な解決策の 1 つは、UIAppearance をあまり使用しないか、まったく使用しないことです。UILabel メソッドについては、最初に値を変更する必要があるかどうかを確認し、必要がない場合はセッターを呼び出さないでください。

別の可能な解決策は、少なくとも UIView ベースの呼び出しについては、UIAppearance の再実装である CTAppearance です (遅いままの UIBarItem 外観呼び出しでは何もしません) 現在、プル リクエストだけでいくつかのパッチが必要であり、何らかの助けがなければ UIPopover コンテナーを処理できません。その動作も UIAppearance とは少し異なります (たとえば、呼び出されるタイミングに応じて明示的に設定された値をオーバーライドする場合があります) が、状況によっては (かなり) 役立つ場合があります。

注: UIAppearance は iOS 7.1 で修正されたようです。

于 2013-11-14T19:30:17.437 に答える
5

iOS 7.0 では UIAppearance が段階的に廃止され、場合によっては不安定になっています。UIAppearance ベースの API への呼び出しを確認し、必要に応じて削除してください。*

iOS 7.1 では、以前の問題の多くが修正され、UIAppearance のランタイムとの対話が高速化されたようです。それでも、UIAppearance のセマンティクスは iOS 6 以降大幅に変更されています。注意してください。

*これは、iOS 7 ベータ版 SDK が公開されている間、部分的にのみ当てはまりました。

于 2013-10-02T20:41:50.857 に答える