0

関数コードを NSAssert または NSParameter assert に入れていることに何度か遭遇しました。

NSParameterAssert( [self doSomeWork] );

これに関する問題は、リリース ビルドを実行すると、テストが失敗した場合に中止するコードがコードから省略されるだけでなく、() 内のコードも省略されることです。

明らかに、この修正は簡単ですが、私にはこれがまだ間違っているように見えます。コードのロジックは、テスト ビルドとリリース ビルドの間で変更されています。

このパターンは、アサートが失敗した場合にプログラマーのエラーである場合にのみ使用することを明確にする必要があります。

4

2 に答える 2

1

個人的には、コードが実行されることを保証する AssertMacros を好みますが、アサーションは使用しません。

http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/EXTERNAL_HEADERS/AssertMacros.h

于 2012-09-20T16:05:49.623 に答える
0

私は assert と NSAssert の両方を使用しているので、適切な値を定義して Distribution ビルドでそれらを無効にします (通常は、構成 ReleaseWithAsserts を使用して、アサートを有効にして最適化されたコードを取得し、可能な限り実際の分散コードに近づけてテストします)。

私がすることはこれです(NDEBUGがassert()用である場合は、他の定義を使用できます):

#ifndef NDEBUG
BOOL didWorkSucceed = 
#endif
[self doSomeWork]; // returns a BOOL if succeeds

assert(didWorkSucceed);

ロギングなど、あらゆる種類の定義も使用できます。ほとんどの場合、Distribution でリターン コードをテストし、失敗した場合は無視する代わりに nil オブジェクトを返します。

于 2012-09-20T13:33:33.843 に答える