9

私のプロジェクトにはいくつかのassert(condition, "message")ステートメントがあります。

これらは、開発中に不変条件をチェックするために使用されます。プロダクション/リリースビルドでは無視されると思いました(この回答で述べたように)。ではない。代わりに、TestFlight テスト中にクラッシュを引き起こします。コメントすると、アプリはクラッシュしません。通常、何かが少しうまくいかないことがありますが、クラッシュすることはありません。

私のビルド設定で何かできますか?

私のすべてのアーカイブ スキームは、リリース構成を使用します。

ここに画像の説明を入力

アサートは、カスタム キーボード拡張機能から使用される Cocoa Touch Framework プロジェクトにあります。

すべてのプロジェクト (Cocoa Touch Framework、およびキーボード拡張ターゲットを含むメイン プロジェクト) のすべてのターゲットには、次のビルド設定があります。

Enable Foundation Assertions
    Debug    YES
    Release  NO

Disable Safety Checks  NO

どうしたの?


編集:

Sulthan の回答は、デバッグ ビルドとリリース ビルドの両方でアサートをグローバルに無効にする方法を示しています。それは私が必要とするものではありません。期待どおりに動作させたい - アサートはデバッグで有効にする必要がありますが、リリース ビルドでは無効にする必要があります。

デフォルトでは、そのように動作します。また、私のメイン プロジェクトでもそのように動作します。ただし、そのメイン プロジェクトからリンクされている Framework プロジェクトにあるアサートでは機能しません (この質問の詳細)。なんで?修正方法は?

4

1 に答える 1

2

試したオプション:

Enable Foundation Assertions前処理セクション (マクロ) にあります。Swift は前処理されておらず、マクロを使用していません。このオプションは、 Objective-C で一般的に使用される および同様のマクロを無効NSAssertにします。NSParameterAssert

Disable Safety Checksはパフォーマンス オプションです。

デフォルトでは、標準ライブラリはメモリの安全性を保証します。多くの関数とメソッドは、有効な配列インデックスなど、呼び出し元が満たさなければならない要件を文書化しています。要件に違反した場合でも、メモリの安全性は保証されます。ただし、要件に違反すると、実行時エラーが発生する可能性があります。名前に「安全でない」という言葉が含まれる API を使用すると、追加のパフォーマンスが必要な場所で安全性チェックを明示的に無効にすることができます。安全でない API を使用するコードのメモリの安全性を確認するのは、ユーザーの責任です。マルチスレッド コードで競合状態が発生した場合も、メモリの安全性は保証されません。

( Swift ライブラリ リファレンス)

ここで私の答えを試してみてください (-assert-config Releaseで使用Other Swift Flags)。

または、アサートを本番ビルドに保持するだけです。アサートの失敗はすべてバグであり、一般に、バグについてできるだけ早く知ることをお勧めします。

于 2016-04-02T14:16:32.893 に答える