私はしばしばiOSコードで「assert」を見ました。私はそれをgoogleし、それが本当か偽であるかを知るようになった。リリースビルドでNSAssertが無効になっているかどうかを知るには?
これがリリースモードで自動無効になるかどうかを知りたいですか?
私はしばしばiOSコードで「assert」を見ました。私はそれをgoogleし、それが本当か偽であるかを知るようになった。リリースビルドでNSAssertが無効になっているかどうかを知るには?
これがリリースモードで自動無効になるかどうかを知りたいですか?
NSAssert()とそのコンパニオンを使用してください。
は、リリース構成ではNS_BLOCK_ASSERTIONS
と定義されています。
Xcode 4 tremplatesは、リリース設定でNSAsserts
を無効にします。 「リリース」の「その他のCフラグ」に「
-DNS_BLOCK_ASSERTIONS=1
を追加します。ドキュメントから
:プリプロセッサマクロNS_BLOCK_ASSERTIONS
が定義されている場合
アサーションが無効になっています。
NSAssertマクロは条件を評価し、アサーションハンドラのフロントエンドとして機能します。
各スレッドには、独自のアサーションハンドラがあり、これはクラスNSAssertionHandler
のオブジェクトです。アサーションハンドラが呼び出されると、メソッドとクラス名(または関数名)を含むエラーメッセージが出力されます。その後、NSInternalInconsistencyException
例外が発生します。 conditionがNOと評価された場合、マクロは現在のスレッドのアサーション・ハンドラ上でhandleFailureInMethod:object:file:lineNumber:description:
を呼び出し、descを記述文字列として渡します。
このマクロは、Objective-Cメソッド内でのみ使用する必要があります。
NDEBUG
が定義されていると、条件付きでコードからアサーションがコンパイルされます。対応するビルド設定セクションでNDEBUG=1
を定義すると、リリースまたはデバッグモードに関係なく、コード内のアサートを無効にします。
Zaphとしては、-DNS_BLOCK_ASSERTIONS=1
がリリース用に設定されています。しかし、これをチェックしたい場合。
NSAssertがマクロNS_BLOCK_ASSERTIONS
によって無効になっていることを最初に確認します。そして、ビルドにこれを追加し、[OK]準拠観察:
#ifdef NS_BLOCK_ASSERTIONS
#error Error - NS_BLOCK_ASSERTIONS is defined
#endif
は、次に(CMD - シフト - <)を解放するスキームを変更
を次にビルドが失敗したことを確認します。従って、NS_BLOCK_ASSERTIONS
は、NSAssert
が無効であることを意味して定義されています。
Xcode 6以降、設定はENABLE_NS_ASSERTIONS
で、デバッグ設定では1
、デフォルトでは0
に設定されています。
アサーション条件をチェックするユニットテストを実行するのに、ENABLE_NS_ASSERTIONS=1
引数を渡して、それ以外の場合はDEBUG
フラグをオフにして実行する必要があります。
更新:これはXcode 8でも有効です。
Xcode 7では、プロジェクトビルドの設定に行き、検索バーで "Assert"を検索します。これは、「Apple LLVM 7.0 - 前処理」セクションを示しています。 「Enable Foundation Assertions」という名前の設定があります。
そこからNSAssertを有効/無効にすることに成功しました。
は、アプリケーションの 'AppName.xcodeproj/project.pbxproj'ファイルに' ENABLE_NS_ASSERTIONS = NO; 'フラグを追加します – computingfreak
は、ここで私は私のmain()
の上部に何をすべきかです:main()
はCの関数ではなくObjective-Cの関数であることから、NSCAssert
はむしろNSAssert
よりも上で使用していることを
#if defined(NDEBUG)
{
// The assertion code below should be compiled out of existence in a release
// build. Log an error and abort the program if it is not.
bool ok = true;
NSCAssert(ok = false, @"NS assertions should be disabled but are not");
if (!ok)
{
NSLog(@"Detected release build but NS_BLOCK_ASSERTIONS is not defined");
return -1;
}
}
#endif
注意。 (NSAssert
はself
が有効と予想しています)
これは、率直に言って、リリースビルドではアサーションがデフォルトでオフになっていないクレイジーなデザインです。私が知っている他のすべてのCコンパイラの顔に飛んできます。 –
@SevaAlekseyevアサーションがまだリリースで終わったとき、私たちはショックを受けました。全く変わった。私たちの哲学は、「開発が急速に失敗し、生産が難しい」というものです。 –