web-dev-qa-db-ja.com

NSAssertとアサート:どちらをいつ使用しますか?

最近、2つの非常に興味深いアドバイスを読みました。

  1. このStackOverflowの答え へのコメントで、@ Mike Wellerは、実稼働コードではアサーションをそのままにしておくように言っています...パフォーマンスへの影響は本当にありますか?それらを残さない理由はありますか?
  2. Vincent Gableのブログ で、彼はassertよりもNSAssertを好むべきだと述べています... assertを使用しない理由はありますか? (文字が少ない:))
50
Dan Rosenstark

2つの質問に答えるには:

  1. アサーションでの実際のアクションに時間がかかる場合を除き、アサーションでのパフォーマンスの低下はほとんどありません(例:assert([obj calculateMeaningOfLife] == 42))。アサーションは、パフォーマンス面で、余分なifステートメントと変わらないはずです。リリースビルドでアサーションを削除する理由は、それらが本質的にデバッグツールであり、実行時に矛盾した内部プログラムの状態をキャッチするためです。開発者の観点からは、何か問題が発生するとすぐにアプリがクラッシュする方がはるかに優れていますが、ユーザーの観点からは、アプリがクラッシュしない場合は間違いなく面倒ではありません(異常な状態でアプリを実行させて恐ろしいことが発生しない限り) )、エラーメッセージで開発の詳細を公開するのは不快です。両側に適切な引数があります-正しく覚えていればCode Complete削除することをお勧めしますがPragmatic Programmerはそのままにしておくことをお勧めします。いずれにしても、アサーションはそうではありません適切なエラー処理の代替であり、プログラミングエラーにのみ使用する必要があります。

  2. NSAssertと通常のassertの基本的な違いは、NSAssertがアプリをクラッシュさせるだけで、assertが失敗すると例外が発生することです。 NSAssertを使用すると、より洗練されたエラーメッセージを提供してログに記録することもできます。実際には、この2つの間に大きな違いはないと思います。アサーションによってスローされた例外を処理する理由を考えることはできません。 (髪を分割するには、assert.hを含める必要がないため、NSAssertは通常、入力が少なくなると思いますが、それはここにもそこにもありません。)

56
shosti

NSAssert()マクロは、Objective-Cメソッド内でのみ使用する必要があります。

NSAssert()は、プリプロセッサマクロNS_BLOCK_ASSERTIONSが定義されている場合(通常はリリースバージョンで)無効になっています。

4
Freeman