3

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

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

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

然后确认我们对 NSAssert 的调用确实被阻止了,这就是我正在尝试的方法,也是我寻求建议的地方:我将符号表从生成的二进制文件中转储出来,并寻找 NSAssert 宏调用的实际方法,像这样:

# 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 的所有代码调用——我如何验证是否是这种情况?任何建议,将不胜感激!

4

1 回答 1

5

你可以放入NSAssert(false, @"test");一个你知道你会命中的代码路径,看看它是否会被发布版本命中,看起来。

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

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

于 2013-05-04T06:10:10.547 回答