2

例: ビュー コントローラーがあり、それを取り除きます。しかし、メモリアドレスを保持する変数がまだあります。それにアクセスすると、EXEC_BAD_ACCESS になります。もちろん。しかし:その変数がまだ有効かどうかを確認する方法はありますか? つまり、メモリ内に存在するものをまだ指している場合はどうなりますか?

4

4 に答える 4

18

これをもう一度読む必要があります:

Cocoa メモリ管理ガイドライン

要するに、何かを定着させたい場合は、それを維持する必要 retainがあります。

何かをなくしたいのに、以前にそれを保持していた場合はrelease、それを削除する必要がありますautorelease

直接呼び出してはいけません(すべてのメソッドの最後を除く)。dealloc[super dealloc];dealloc

あなたは決して release、またはあなたautoreleaseがしなかったオブジェクトをしてはいけませんretain

一部のメソッドは、必要な保持オブジェクトを返すことに注意してくださいreleaseallocクラスのインスタンスの場合、それはretain. あなたcopyとインスタンスの場合、コピーは保持されます。

この方法を使用したくなる場合は、使用retainCountしないでください。役に立ちません。保持カウントのみをデルタと見なしてください。加算する場合は減算する必要がありますが、絶対値は実装の詳細であり、無視する必要があります。

(言い換えると、オブジェクトの有効性を決定的に確認する方法があったとしても (そうではありません)、それは間違った答えになります。)

ああ、XcodeのBuild and Analyze機能を使用してください。とりわけ、メモリ管理の問題を特定するという非常に優れた (ただし完全ではない) 作業を行います。

于 2010-02-25T18:56:45.217 に答える
2

それが、メモリ管理モデル全体が設定されていることです。retain適切なタイミングで適切なタイミングで呼び出すreleaseautorelease、それは起こりません。NSZombieデバッグに役立てることができます。

于 2010-02-25T18:30:37.060 に答える
1

「NSZombieEnabled」ブレークポイントを使用します。

このため、アクセサーの使用を強くお勧めするのはすべての人だけです。オブジェクトがどこかでリリースされた場合、そのオブジェクトはnilに割り当てられ、NilオブジェクトでAPIまたはメソッドを呼び出しても害はありません。ですから、アクセサーを使う習慣をつけてください。

このNSZombieEnabledフラグを、ビルド設定でアプリケーションの引数として追加するだけです。有効にします。これで、アプリケーションをデバッグモードで実行します。このようなクラッシュが発生しようとしている場合、このブレークポイントは、どのオブジェクトが解放され、どこでクラッシュしているかを示します。

乾杯、マンジュナス

于 2010-02-26T06:11:26.090 に答える
0

変数の場合、オブジェクトへのポインターがまだ有効なメモリを参照しているかどうかを意味します。

MyClass *myVariable = [[MyClass alloc] init];

// たくさんのことが起こります...

if (myVariable != nil) //その他の処理を行う

于 2010-02-25T18:45:15.883 に答える