繁体   English   中英

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

[英]How to confirm our code does not call NSAssert in iOS release binary

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

要在我们的发布版本中禁用NSAssert调用,我已将NS_BLOCK_ASSERTIONS = 1(从此处 )常量添加到我正在使用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的调用 - 如何验证是否是这种情况? 任何建议,将不胜感激!

你可以把NSAssert(false, @"test"); 在一个代码路径中,你知道你会遇到它,看看它是否会被Release版本击中,似乎。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM