web-dev-qa-db-ja.com

Objective-CのNS_BLOCK_ASSERTIONS

私はiPhoneアプリケーション内でNSAssert()呼び出しを使用していますが、Appleのドキュメントから、NS_BLOCK_ASSERTIONSが定義されている場合、アサーションはコードにコンパイルされないことがわかります。

アサーションをオフにするには、ヘッダーファイルで次のように宣言します。#define NS_BLOCK_ASSERTIONS

ただし、アサートコードはまだ実行されているようです。

ここに欠けているものはありますか?

ありがとう

ジョン

37
John Muchow

標準テンプレートの1つに基づいてXcodeプロジェクトを作成した場合、Cocoaヘッダー(NSAssertマクロを含むNSException.hを含む)は、プロジェクト内の他のファイルの前に前処理されます。したがって、プロジェクトのヘッダーまたは実装ファイルの#define NS_BLOCK_ASSERTIONSは、NSAssertマクロに影響を与えません。

NS_BLOCK_ASSERTIONSをターゲットまたはプロジェクトのプリプロセッサマクロに入れてみてください(リリース構成の場合のみ)。

GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS

または、#define NS_BLOCK_ASSERTIONSまたは#import <Cocoa/Cocoa.h>行の前のプレフィックス(.pch)ヘッダーに#import <Foundation/Foundation.h>を配置します。

61
puzzle

@dwsolbergが述べたように、XcodeにはENABLE_NS_ASSERTIONSと呼ばれる新しいビルド設定があります。新しいプロジェクトの場合、リリース構成の値はNOに設定され、他のすべての構成の値はYESに設定されます。この設定と、Xcode6で引き続き有効な広く使用されているNS_BLOCK_ASSERTIONSアプローチを使用できます。

Preprocessor Macro Approach

Foundation Assertion Build Setting

アサーションは、開発時にバグを追跡するためのツールであり、生産的なコードで発生することはありません。また、例外は、それが絶対に必要な場合、つまり、プログラムが実行を続行できないほど問題が発生した場合にのみ使用する必要があります。 Cocoaの方法は、重要なメソッドにブール値の戻り値を与え、メソッドの内部で設定でき、戻り値がNOの場合に外部で使用できるエラーオブジェクトでパラメーター化することです。

それが何人かの人々を助けることを願っています;-)

13
blackjacx