例: ビュー コントローラーがあり、それを取り除きます。しかし、メモリアドレスを保持する変数がまだあります。それにアクセスすると、EXEC_BAD_ACCESS になります。もちろん。しかし:その変数がまだ有効かどうかを確認する方法はありますか? つまり、メモリ内に存在するものをまだ指している場合はどうなりますか?
4 に答える
これをもう一度読む必要があります:
要するに、何かを定着させたい場合は、それを維持する必要 retain
があります。
何かをなくしたいのに、以前にそれを保持していた場合はrelease
、それを削除する必要がありますautorelease
。
直接呼び出してはいけません(すべてのメソッドの最後を除く)。dealloc
[super dealloc];
dealloc
あなたは決して release
、またはあなたautorelease
がしなかったオブジェクトをしてはいけませんretain
。
一部のメソッドは、必要な保持オブジェクトを返すことに注意してくださいrelease
。alloc
クラスのインスタンスの場合、それはretain
. あなたcopy
とインスタンスの場合、コピーは保持されます。
この方法を使用したくなる場合は、使用retainCount
しないでください。役に立ちません。保持カウントのみをデルタと見なしてください。加算する場合は減算する必要がありますが、絶対値は実装の詳細であり、無視する必要があります。
(言い換えると、オブジェクトの有効性を決定的に確認する方法があったとしても (そうではありません)、それは間違った答えになります。)
ああ、XcodeのBuild and Analyze機能を使用してください。とりわけ、メモリ管理の問題を特定するという非常に優れた (ただし完全ではない) 作業を行います。
それが、メモリ管理モデル全体が設定されていることです。retain
適切なタイミングで適切なタイミングで呼び出すrelease
とautorelease
、それは起こりません。NSZombie
デバッグに役立てることができます。
「NSZombieEnabled」ブレークポイントを使用します。
このため、アクセサーの使用を強くお勧めするのはすべての人だけです。オブジェクトがどこかでリリースされた場合、そのオブジェクトはnilに割り当てられ、NilオブジェクトでAPIまたはメソッドを呼び出しても害はありません。ですから、アクセサーを使う習慣をつけてください。
このNSZombieEnabledフラグを、ビルド設定でアプリケーションの引数として追加するだけです。有効にします。これで、アプリケーションをデバッグモードで実行します。このようなクラッシュが発生しようとしている場合、このブレークポイントは、どのオブジェクトが解放され、どこでクラッシュしているかを示します。
乾杯、マンジュナス
変数の場合、オブジェクトへのポインターがまだ有効なメモリを参照しているかどうかを意味します。
MyClass *myVariable = [[MyClass alloc] init];
// たくさんのことが起こります...
if (myVariable != nil) //その他の処理を行う