简单的问题。
如果我有
BOOL a = [myInst function];
NSAssert(a, @"...")
然后我会在发布版本中收到警告,因为没有使用。我想断言从函数返回的BOOL,但我不需要使用它。我该如何解决?
我无法将整个表达式放入NSAssert中,因为它不会在发行版中编译。
答案 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
但是有一些不同之处:
condition
,它将确定断言是否应该失败。NS_BLOCK_ASSERTIONS
宏customized based on your project's target settings。