NSParameterAssertとは何ですか?


回答:


115

これは、メソッドのパラメーターがnil0でないかどうかをテストする簡単な方法です。したがって、基本的には、これを使用して前提条件を作成し、いくつかのパラメーターを設定する必要があることを示します。設定されていない場合、マクロによりアプリケーションが中止され、その行でエラーが生成されます。そう:

- (void)someMethod:(id)someObjectThatMustNotBeNil
{
  // Make sure that someObjectThatMustNotBeNil is really not nil
  NSParameterAssert( someObjectThatMustNotBeNil );
  // Okay, now do things
}

前提条件は、メソッド/ APIがプログラマーによって正しく呼び出されていることを確認する簡単な方法です。プログラマーが前提条件に違反した場合、アプリケーションは早期に終了するという考え方です。できれば、デバッグと基本的なテスト中に終了します。

NSParameterAssert ただし、任意の式がtrueと評価されることをテストするために使用できるため、次のように使用することもできます。

NSParameterAssert( index >= 0 ); // ensure no negative index is supplied

NSParameterAssert()マクロに関するAppleのドキュメント


1
コードで例外をキャッチするようにしてください。そうしないと、Assertがtrueの場合、アプリがクラッシュします。
lucius 2010年

14
@lucius:アサートは、分散アプリケーションの条件をチェックするために使用されるべきではありません。アサートは、開発中のエラーをキャッチするためにあります。サイレントに失敗するのではなく、悪い状態(ペン先への接続されていないコンセントなど)で何かをクラッシュさせると、問題を早期に見つけることができます。多くの人は、配布時にマクロまたは#ifdefを使用してこれらを無効にします。
BradLarson

5
@ lucius-目標は、前提条件が満たされない場合にアプリケーションを中止させることです。これにより、プログラマーは自分が何か間違ったことをしたことをすぐに知ることができます。Cocoaのアサーションが評価されないようにするには、NS_BLOCK_ASSERTIONSマクロを定義できます。これにより無効になりますが、クラッシュを防ぐのではなく、副作用や遅いコードの実行を防ぐことが目的です。本番環境では、正しく使用された場合、アサーションがトリガーされることはありません。
ジェイソンココ

1
本番ビルドを行うときに、これらのアサーションを簡単な方法で削除することは可能ですか?IMHOこれらは、プログラミングエラーをキャッチするために開発中に最もよく使用されます(上記のコメントで述べたように)。
Johan Karlsson 2013年

5
@JohanKarlssonこれは可能であり、Release構成内の現在のバージョンのテンプレート(これはかなり前に戻ります)でデフォルトで設定されます。これを制御するにはENABLE_NS_ASSERTIONS、新しいバージョンのXcodeでビルド設定を設定するか、NS_BLOCK_ASSERTIONSマクロを定義して1に設定します。Xcode5には、ビルド設定とデフォルトをYesinDebugNoinに設定するプロジェクト設定* Enable FoundationAssertions`があります。Release構成。
ジェイソンココ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.