2

オブジェクトが作成されると、ランタイムはすべてのプロパティを nil で自動的に初期化するといつも信じていました。

ただし、App Store のリリース ビルドは、開発中のデバッグ ビルドとは異なります。Xcode は、変数やプロパティに関するさまざまなセキュリティ チェック メカニズムを備えたデバッグ用のより安定したビルドを作成し、クラッシュを防ぎながらコードを肥大化させると聞いています。

配布用にビルドする場合、コンパイラの最適化により、この「不要な」デバッグ コードが取り除かれ、コードが高速になります。

リリースビルドで突如発生した謎のバグを経験したことがあります。しかし今、開発者は私にこれも言いました: リリース ビルドでは、ランタイムはプロパティを nil に設定しません。それらは初期化されていません。手動で行わない限り、それらの値はガベージメモリです。したがって!foobar、プロパティを nil で初期化しない限り、チェックするのは安全ではありません。

これまでのところ、オブジェクトを設定しない限り、すべてのアプリは常にプロパティが nil であると想定しています。

これは正しいですか、それとも、オブジェクトを作成するときにランタイムがプロパティを nil に初期化しますか?

4

2 に答える 2

15

問題の開発者は間違って おり、彼らがあなたに与えた他の「アドバイス」は非常に疑わしいものとして保持する必要があります。

によって合成されたものを含むすべてのインスタンス変数は@property、Objective-C ランタイムによる割り当て時に常にゼロに設定されます。これは、言語の開始以来、Objective-C ランタイムの定義され、文書化されている動作です。

静的変数も常にゼロ/nil/NULL に初期化されます。ローカル変数は、manual-retain-release では初期化されず、ARC を使用するとゼロ/nil/NULL に初期化されます。

DEBUG ビルドと RELEASE ビルドには 2 つの重要な違いがあります。

  • リンカはデバッグ シンボルを取り除きます。これにより、コードのデバッグが難しくなりますが、実行可能ファイルはかなり小さくなります。

  • オプティマイザーは、コードのサイズと速度を最適化します。

DEBUG と RELEASE の間で「不思議な」動作の変化を引き起こすのは、その 2 番目のものです。オプティマイザーは、必要に応じてスタック スペースを再利用し、コード内の操作を並べ替えます (たとえば、並べ替えは可能ですが、メソッド呼び出しはできません)。これにより、コードが高速化され、小さくなります。これは、DEBUG ビルドに存在するバグを発見する傾向がありますが、コンパイラがスタック上で何かを動かしていないため、トリップされていません。

于 2013-05-24T16:25:12.220 に答える