0

我有几次被抓到把函数代码放在 NSAssert 或 NSParameter 断言中,比如

NSParameterAssert( [self doSomeWork] );

这样做的问题是,当您进行发布构建时,不仅会在测试失败时中止的代码从代码中省略,而且我在 () 中的代码也被省略了。

显然这个修复很简单,但对我来说这似乎仍然是错误的,代码的逻辑在测试构建和发布构建之间发生了变化。

我应该说清楚,我只在断言失败是程序员错误的情况下使用这种模式。

4

2 回答 2

1

就个人而言,我更喜欢 AssertMacros,它保证代码将被执行,但不使用断言。

http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/EXTERNAL_HEADERS/AssertMacros.h

于 2012-09-20T16:05:49.623 回答
0

我同时使用了 assert 和 NSAssert,因此定义了适当的值以在分发构建中禁用它们(我通常也使用配置 ReleaseWithAsserts 来获得启用断言的优化代码,因此测试尽可能接近实际的分布式代码)。

我要做的是(如果你想要 NDEBUG 用于 assert(),你可以使用另一个定义):

#ifndef NDEBUG
BOOL didWorkSucceed = 
#endif
[self doSomeWork]; // returns a BOOL if succeeds

assert(didWorkSucceed);

您也可以将定义用于各种东西 - 日志记录等。大多数情况下,我会在 Distribution 中测试返回代码,如果失败则返回 nil 对象而不是忽略它。

于 2012-09-20T13:33:33.843 回答