2011-12-18 11 views
34

私はしばしばiOSコードで「assert」を見ました。私はそれをgoogleし、それが本当か偽であるかを知るようになった。リリースビルドでNSAssertが無効になっているかどうかを知るには?

これがリリースモードで自動無効になるかどうかを知りたいですか?

+2

これは、率直に言って、リリースビルドではアサーションがデフォルトでオフになっていないクレイジーなデザインです。私が知っている他のすべてのCコンパイラの顔に飛んできます。 –

+0

@SevaAlekseyevアサーションがまだリリースで終わったとき、私たちはショックを受けました。全く変わった。私たちの哲学は、「開発が急速に失敗し、生産が難しい」というものです。 –

答えて

38

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メソッド内でのみ使用する必要があります。

4

NDEBUGが定義されていると、条件付きでコードからアサーションがコンパイルされます。対応するビルド設定セクションでNDEBUG=1を定義すると、リリースまたはデバッグモードに関係なく、コード内のアサートを無効にします。

24

私はここメタ答えを提供します:

@CocoaFuと@dasblinkenlightどちらが正しいです。 NS_BLOCK_ASSERTIONSNSAssert()となり、NDEBUGはオフになります。assert()がオフになります。両方を使用する場合は、両方が必要です。

+0

iOS 5の読み方@Robによるプログラミング:それを入手して、読み、iOS 5でより良いプログラムを作成してください。 – zaph

+0

残念ながら、2つの言葉の要約に間違って綴られています。 – Ant

+1

表示され、修正されました。 NSDEBUG-> NDEBUG –

7

Zaphとしては、-DNS_BLOCK_ASSERTIONS=1がリリース用に設定されています。しかし、これをチェックしたい場合。

NSAssertがマクロNS_BLOCK_ASSERTIONSによって無効になっていることを最初に確認します。そして、ビルドにこれを追加し、[OK]準拠観察:

#ifdef NS_BLOCK_ASSERTIONS 
#error Error - NS_BLOCK_ASSERTIONS is defined 
#endif 

は、次に(CMD - シフト - <)を解放するスキームを変更

enter image description here

を次にビルドが失敗したことを確認します。従って、NS_BLOCK_ASSERTIONSは、NSAssertが無効であることを意味して定義されています。

0

Xcode 6以降、設定はENABLE_NS_ASSERTIONSで、デバッグ設定では1、デフォルトでは0に設定されています。

アサーション条件をチェックするユニットテストを実行するのに、ENABLE_NS_ASSERTIONS=1引数を渡して、それ以外の場合はDEBUGフラグをオフにして実行する必要があります。

26

更新:これはXcode 8でも有効です。

Xcode 7では、プロジェクトビルドの設定に行き、検索バーで "Assert"を検索します。これは、「Apple LLVM 7.0 - 前処理」セクションを示しています。 「Enable Foundation Assertions」という名前の設定があります。

そこからNSAssertを有効/無効にすることに成功しました。

enter image description here

+2

は、アプリケーションの 'AppName.xcodeproj/project.pbxproj'ファイルに' ENABLE_NS_ASSERTIONS = NO; 'フラグを追加します – computingfreak

0

は、ここで私は私の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 

注意。 (NSAssertselfが有効と予想しています)

関連する問題