如何确认我们的代码不会在iOS发布二进制文件中调用NSAssert

时间:2012-08-15 20:04:03

标签: ios release nsassert

我想在构建我们的发布iOS二进制文件时禁用在我们的代码行中发生的NSAssert调用,然后我想确认它们被禁用,因为我是超级偏执。如何确认他们已被禁用?

要在我们的发布版本中禁用NSAssert调用,我已将NS_BLOCK_ASSERTIONS = 1(来自here)常量添加到我正在使用xcodebuild进行的命令行发布构建中,以便在整个应用程序中阻止NSAsserts构建,包括它使用的所有静态库的构建。有几十个静态库,尝试验证每个lib的项目文件中都设置了这个标志是太多的维护,所以这种全局方法是首选。它看起来像这样:

xcodebuild -target MyApp -configuration MyReleaseConfig -DNS_BLOCK_ASSERTIONS=1 build

然后确认我们对NSAssert的调用确实被阻止了,这就是我正在尝试的,以及我在哪里寻求建议:我从生成的二进制文件中转储符号表,并为NSAssert的实际方法进行grepping宏调用,像这样:

# Use 'nm' tool to dump symboltable into txt file
/Applications/Xcode.app/Contents/Developer/usr/bin/nm MyApp.app/MyApp > MyApp.symbols.txt

# Search symbols for NSAssertionHandler:
grep "NSAssertionHandler" ./MyApp.symbols.txt

# Output results:
RESULT=$?
if [ $RESULT -eq 0 ]
then
    echo -e "** ASSERTION CHECKER FAILED: FOUND 1 OR MORE NSASSERT CALLS IN RELEASE BINARY **"
else
    echo -e "** ASSERTION CHECKER SUCCEEDED:  NO NSASSERT CALLS IN RELEASE BINARY **"
fi

问题是我仍然看到NSAssertionHandler出现在符号中:

U _OBJC_CLASS_$_NSAssertionHandler

我怀疑我正在使用nm错误;或者,也许这个符号出现是因为我们链接到使用NSAsserts的第三方库,或者iOS API本身使用NSAsserts,从而混淆了我的验证步骤。我希望在我们的发布版本中阻止所有代码对NSAssert的调用 - 如何验证是否是这种情况?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:5)

你可以将NSAssert(false, @"test");放在一个你知道你会遇到的代码路径中,看看它是否会因为版本构建而受到影响。

无论如何,因为这是一个古老的问题,我想知道同样的事情,我想我会给出一个更新。对于Xcode 4.6.3中的我,我自动为我看到为我的发布版本定义的DNS_BLOCK_ASSERTIONS=1 - 所以NSAssert确实没有编译到Release版本中。

我还在一个始终命中的代码路径中对此进行了测试,并且断言未被命中。它甚至没有被编译,因为我实际上忘记了@,它甚至不会在Debug中编译,而是在Release中编译。