NSAssert(boolean)在发布中

时间:2012-08-02 08:28:45

标签: objective-c

简单的问题。

如果我有

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

然后我会在发布版本中收到警告,因为没有使用。我想断言从函数返回的BOOL,但我不需要使用它。我该如何解决?

我无法将整个表达式放入NSAssert中,因为它不会在发行版中编译。

5 个答案:

答案 0 :(得分:3)

你试过吗

#pragma GCC diagnostic ignored "-Wunused-variable"

<your function>

#pragma GCC diagnostic warning "-Wunused-variable"

答案 1 :(得分:2)

只要导致a的表达没有副作用,为什么不将它直接放入NSAssert? E.g。

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

请注意,如果<expr>有副作用,例如打印一些东西,这可能不会发生在非调试版本中。

答案 2 :(得分:2)

我不喜欢这个警告。

以下是我在这些案件中所做的事情:

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

答案 3 :(得分:1)

再一次提到BOOL:

a = !(!a); 

if (a) {}

答案 4 :(得分:0)

How to know if NSAssert is disabled in release builds?中所述,您可以使用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

现在用ABCAssert替换对NSAssert的所有调用。除了确保始终使用条件之外,它还会记录任何断言失败,而不是默默地忽略它们。

警告:我还没有测试过上面的代码。当我有更多时间时,我会更新它以确保它正常工作。


这类似于Abizer Nasir's coding conventions定义:

#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

但是有一些不同之处: