簡単な質問。
私が持っている場合
BOOL a = [myInst function];
NSAssert(a, @"...")
次に、が使用されていないため、リリースビルドで警告が表示されます。関数から返されたBOOLをアサートしたいのですが、使用する必要はありません。どうすれば修正できますか?
リリースではコンパイルされないため、式全体をNSAssertに入れることはできません。
簡単な質問。
私が持っている場合
BOOL a = [myInst function];
NSAssert(a, @"...")
次に、が使用されていないため、リリースビルドで警告が表示されます。関数から返されたBOOLをアサートしたいのですが、使用する必要はありません。どうすれば修正できますか?
リリースではコンパイルされないため、式全体をNSAssertに入れることはできません。
やってみました
#pragma GCC diagnostic ignored "-Wunused-variable"
<your function>
#pragma GCC diagnostic warning "-Wunused-variable"
結果の式にa
副作用がない限り、直接入れてみませんNSAssert
か? 例えば
NSAssert(<expr>, @"...")
<expr>
副作用がある場合、たとえば何かを出力する場合、これは非デバッグ ビルドでは発生しない可能性があることに注意してください。
私はその警告が嫌いです。
これらの場合に私が行うことは次のとおりです。
BOOL a = NO;
a = [myInst function];
NSAssert(a, @"...")
BOOL についてもう一度言及してください。
a = !(!a);
また
if (a) {}
リリース ビルドで NSAssert が無効になっているかどうかを知る方法で述べたように? を使用NS_BLOCK_ASSERTIONS
すると、NSAssert がオーバーライドされて何もしないかどうかを知ることができます。
したがって、独自のアサーション マクロを定義できます。
#ifdef NS_BLOCK_ASSERTIONS
#define ABCAssert(condition, ...) \
do { \
if (!condition) \
NSLog(__VA_ARGS__); \
} while (0)
#else
#define ABCAssert(condition, ...) NSAssert(condition, __VA_ARGS__)
#endif
ここで、NSAssert へのすべての呼び出しを ABCAssert に置き換えます。条件が常に使用されるようにするだけでなく、アサーションの失敗を黙って無視するのではなくログに記録します。
警告: 上記のコードはテストしていません。時間ができたら、適切に機能するように更新します。
これは、以下を定義するAbizer Nasir のコーディング規約に似ています。
#ifdef DEBUG
#define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]
#else
#ifndef NS_BLOCK_ASSERTIONS
#define NS_BLOCK_ASSERTIONS
#endif
#define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__])
#endif
ただし、いくつかの違いがあります。
condition
アサーションが失敗するかどうかを決定する最初のオプション を保持します。NS_BLOCK_ASSERTIONS
できる既存のマクロを使用します。