Jef*_*fro 3 release ios nsassert
我想在构建我们的发布iOS二进制文件时禁用在我们的代码行中发生的NSAssert调用,然后我想确认它们被禁用,因为我是超级偏执.我如何确认他们被禁用?
要在我们的发布版本中禁用NSAssert调用,我已将NS_BLOCK_ASSERTIONS = 1(从此处)常量添加到我正在使用xcodebuild进行的命令行发布构建,以便在整个应用程序的构建中阻止NSAsserts,包括构建所有我们使用的静态库.有几十个静态库,尝试验证每个lib的项目文件中都设置了这个标志是太多的维护,所以这种全局方法是首选.它看起来像这样:
xcodebuild -target MyApp -configuration MyReleaseConfig -DNS_BLOCK_ASSERTIONS=1 build
Run Code Online (Sandbox Code Playgroud)
然后确认我们对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
Run Code Online (Sandbox Code Playgroud)
问题是我仍然看到NSAssertionHandler出现在符号中:
U _OBJC_CLASS_$_NSAssertionHandler
Run Code Online (Sandbox Code Playgroud)
我怀疑我要么使用nm不正确; 或者,也许这个符号出现是因为我们链接到使用NSAsserts的第三方库,或者iOS API本身使用NSAsserts,从而混淆了我的验证步骤.我希望在我们的发布版本中阻止所有代码对NSAssert的调用 - 如何验证是否是这种情况?任何建议,将不胜感激!
你可以放入NSAssert(false, @"test");一个你知道你会遇到的代码路径,然后看看它是否会被Release版本命中.
无论如何,因为这是一个古老的问题,我想知道同样的事情,我想我会给出一个更新.对于我来说,在Xcode 4.6.3中DNS_BLOCK_ASSERTIONS=1,我自动为我看到了为我的发布版本定义的内容 - 因此NSAssert确实没有编译到Release版本中.
我还在一个总是命中的代码路径中对它进行了测试,并且断言未被命中.它甚至没有被编译,因为我实际上忘记了@它,它甚至不会在Debug中编译,而是在Release中编译.