2

簡単な質問。

私が持っている場合

BOOL a = [myInst function];
NSAssert(a, @"...")

次に、が使用されていないため、リリースビルドで警告が表示されます。関数から返されたBOOLをアサートしたいのですが、使用する必要はありません。どうすれば修正できますか?

リリースではコンパイルされないため、式全体をNSAssertに入れることはできません。

4

5 に答える 5

3

やってみました

#pragma GCC diagnostic ignored "-Wunused-variable"

<your function>

#pragma GCC diagnostic warning "-Wunused-variable"
于 2012-08-02T08:38:01.560 に答える
2

結果の式にa副作用がない限り、直接入れてみませんNSAssertか? 例えば

NSAssert(<expr>, @"...")

<expr>副作用がある場合、たとえば何かを出力する場合、これは非デバッグ ビルドでは発生しない可能性があることに注意してください。

于 2012-08-02T08:31:27.130 に答える
2

私はその警告が嫌いです。

これらの場合に私が行うことは次のとおりです。

BOOL a = NO;
a = [myInst function];
NSAssert(a, @"...")
于 2012-08-02T08:35:08.837 に答える
1

BOOL についてもう一度言及してください。

a = !(!a); 

また

if (a) {}
于 2012-08-02T08:31:48.960 に答える
0

リリース ビルドで 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

ただし、いくつかの違いがあります。

于 2014-09-23T01:01:21.477 に答える