简单的问题。
如果我有
BOOL a = [myInst function];
NSAssert(a, @"...")
然后我会在发布版本中收到警告,因为没有使用 a 。我想断言从函数返回的 BOOL,但我不需要使用它。我将如何解决它?
我不能将整个表达式放入 NSAssert 中,因为它不会在发布时编译。
简单的问题。
如果我有
BOOL a = [myInst function];
NSAssert(a, @"...")
然后我会在发布版本中收到警告,因为没有使用 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
现在用 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
但是,有一些区别:
condition
它将确定断言是否应该失败。NS_BLOCK_ASSERTIONS
可以根据项目的目标设置自定义的现有宏。