2

简单的问题。

如果我有

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

然后我会在发布版本中收到警告,因为没有使用 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

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

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


这类似于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 回答