最近、2つの非常に興味深いアドバイスを読みました。
assert
よりもNSAssert
を好むべきだと述べています... assert
を使用しない理由はありますか? (文字が少ない:))2つの質問に答えるには:
アサーションでの実際のアクションに時間がかかる場合を除き、アサーションでのパフォーマンスの低下はほとんどありません(例:assert([obj calculateMeaningOfLife] == 42)
)。アサーションは、パフォーマンス面で、余分なif
ステートメントと変わらないはずです。リリースビルドでアサーションを削除する理由は、それらが本質的にデバッグツールであり、実行時に矛盾した内部プログラムの状態をキャッチするためです。開発者の観点からは、何か問題が発生するとすぐにアプリがクラッシュする方がはるかに優れていますが、ユーザーの観点からは、アプリがクラッシュしない場合は間違いなく面倒ではありません(異常な状態でアプリを実行させて恐ろしいことが発生しない限り) )、エラーメッセージで開発の詳細を公開するのは不快です。両側に適切な引数があります-正しく覚えていればCode Complete削除することをお勧めしますがPragmatic Programmerはそのままにしておくことをお勧めします。いずれにしても、アサーションはそうではありません適切なエラー処理の代替であり、プログラミングエラーにのみ使用する必要があります。
NSAssert
と通常のassert
の基本的な違いは、NSAssert
がアプリをクラッシュさせるだけで、assert
が失敗すると例外が発生することです。 NSAssert
を使用すると、より洗練されたエラーメッセージを提供してログに記録することもできます。実際には、この2つの間に大きな違いはないと思います。アサーションによってスローされた例外を処理する理由を考えることはできません。 (髪を分割するには、assert.h
を含める必要がないため、NSAssert
は通常、入力が少なくなると思いますが、それはここにもそこにもありません。)
NSAssert()マクロは、Objective-Cメソッド内でのみ使用する必要があります。
NSAssert()は、プリプロセッサマクロNS_BLOCK_ASSERTIONSが定義されている場合(通常はリリースバージョンで)無効になっています。