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