web-dev-qa-db-ja.com

XcodeはiOS 8のMain()で「すべての例外」ブレークポイントで例外をスローします

私はXcode 6(GM、ベータ版はダウンロードしませんでした)を使用しています。iOS7以降用のアプリを開発しています。すべてのプロジェクトで、Xcode 5で作業していたプロジェクトと同じプロジェクトを開きました。

ブレークポイントナビゲータで、_All Exceptions_ブレークポイントをオンにしています。 _Break: On Throw_に設定されます。これで、(デバイスまたはシミュレーターで)アプリを実行するたびに、return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));関数のmain()行で実行が停止します。

Playを押してプログラムの実行を2回続けると、プログラムは正常に実行されます。ですから、これは私が働くことを妨げるものではありませんが、毎回手動で実行を行い、エディターをリセットする必要があるのは面倒です。

Xcodeで設定した動作(現在のエディターを実行が一時停止した場所に移動する)が好きで、_All Exceptions_ブレークポイントを持つことが重要なIMOです。 (だから私はそれらを変更したくない)

IOS 7ターゲット(再び、デバイスまたはシミュレーター)に対して同じ環境で同じコードを実行することにより、例外はスローされません。

この奇妙な動作を引き起こす可能性のある手がかりはありますか?

51
invalidArgument

コメントで述べたように、All Exceptionsブレークポイントを編集して、C++例外のキャッチをオフにする必要があります。

そのためには、ブレークポイントを右クリックし、ExceptionAll to Objective-C

change All to Objective-C

C++コードの例外は、通常のアプリ機能の一部です。ただし、例外ブレークポイントは、未処理の例外をキャッチするのではなく、後で正しく処理された場合でも、発生した例外をすべてキャッチするため、実行が停止します。

100
Johnnywho

TLDR;私の場合、問題の原因はフォントの欠落でした。

私もこの問題を抱えていました。 @Johnnywhoは、Objective-Cの例外ブレークポイントのみを残すことで、不要な動作を停止することは正しいですが、実際の原因、iOS7で例外なく実行される理由、および一部のプロジェクトでのみこれが発生する理由についてはまだ説明していません。

だからこそ、私がこの問題を抱えていたプロジェクトの1つを詳細に分析し、原因を突き止めることができたのです。この動作には複数の原因が考えられますが、私の場合はカスタムフォントがありませんでした。

テストの簡単な方法:

  1. 新しいシングルビュープロジェクトを開始する

  2. C++を含むすべての例外でブレークポイントを有効にします(ブレークポイント/ + /例外ブレークポイントの追加)

  3. プロジェクトにカスタムフォントをドラッグします(コピーを許可し、ターゲットをチェックして追加します)

  4. メインビューコントローラーのビューにラベルを追加する

  5. ラベルのカスタムフォントを選択します(Xcode 6以降では、プロジェクトにドラッグするとすぐにフォントピッカーに表示されます)。

  6. アプリを実行し、カスタムフォントにラベルが表示されていることを確認します(カスタムフォントが既に使用されている場合、キー「アプリケーションによって提供されるフォント」のInfo.plistにフォントファイル名を追加する必要はないようですアプリのxibのストーリーボードで使用されます)。

  7. 次に、プロジェクトからカスタムフォントを削除します(ターゲットリレーションシップのチェックを外すか、ターゲット設定/ビルドフェーズ/バンドルリソースのコピー)。

  8. デバイスまたはsimからアプリを削除(アプリバンドルからフォントファイルを削除)

  9. 製品/クリーン

  10. アプリを再度実行します(ラベルにはまだカスタムフォントへの参照がありますが、アプリにはそのファイルがありません)。 iOS8で実行すると、不可解な例外に気付くはずです。

  11. IOS7を搭載したデバイスまたはiOS7を搭載したsimでアプリを実行します(そのためにはiOS Deployment TargetをiOS7に変更する必要があります)。ラベルにはカスタムフォントが表示されませんが、例外はありません。

  12. フォントファイルをターゲットに追加し直すと、ブレークポイントは実行時に停止しなくなります。

だから私の結論は、iOS8では見つからないフォントがC++例外を引き起こし、iOS7ではそうではないため、ブレークポイントがトリガーされるということです。

同様の例外(およびブレークポイントトリガー)は、Info.plistファイルの「アプリケーションによって提供されたフォント」キーの下に誤ってフォントファイル名が書き込まれた場合にも発生する可能性があります。

31
Andris Zalitis

これを修正するのに役立った以前の回答をまとめたところです。

問題:カスタムフォントを追加してから明らかに削除(置換)すると、プロジェクトのどこかがまだ彼の参照であり、iOS 8のメインC++ libブレークポイントでブレークポイントが停止する.

解決策

1)プロジェクトで検索し、それらのフォントへのすべての参照を削除(置換)します。いくつかのペン先、サブモジュールなどに…

2)どこでも修正できない場合(例:読み取り専用ライブラリがそれらを使用する場合)、または解決策1の後でも問題が解決しない場合、それらの古いフォントをプロジェクトに追加し直します

3)無視-C++ libであるため、ブレークポイント例外を「すべて」から「Objective-C」のみに変更します。

Xcode 9では、例外がスローされる場合がありますが、iOSが正常にキャッチしています。これは役立ちます

enter image description here

enter image description here

ソース

私の場合、それはnibのユーザー定義属性でした

2
Ted

同じ問題がありました。問題は、フォントが異なる他のプロジェクトからいくつかのインターフェイスファイルを追加したことです。それらを見つけて削除してください。

0
Sunil Kumar