3

リリースの iOS バイナリをビルドするときにコードラインで発生する NSAssert 呼び出しを無効にしたいのですが、それらが無効になっていることを確認したいと思います。それらが無効になっていることを確認するにはどうすればよいですか?

リリース ビルドで NSAssert 呼び出しを無効にするために、xcodebuild で実行しているコマンドライン リリース ビルドに NS_BLOCK_ASSERTIONS=1 (ここから) 定数を追加して、すべてのビルドを含むアプリケーションのビルド全体で NSAssert がブロックされるようにしました使用する静的ライブラリの。多数の静的ライブラリがあるため、各ライブラリのプロジェクト ファイルでこのフラグが設定されていることを確認するにはメンテナンスが多すぎるため、このグローバルなアプローチが推奨されます。次のようになります。

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

次に、NSAssert への呼び出しが実際にブロックされていることを確認するために、ここで私が試みていることとアドバイスを求めています。結果のバイナリからシンボル テーブルをダンプし、NSAssert マクロが呼び出す実際のメソッドを grep しています。このような:

# 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実際にはリリース ビルドにコンパイルされません。

また、これを常にヒットするコードパスでテストしましたが、アサートはヒットしませんでした。私は実際に を忘れて@おり、デバッグでコンパイルすることさえできなかったので、コンパイルさえされていませんでしたが、リリースではコンパイルされました。

于 2013-05-04T06:10:10.547 に答える