1

でアプリがクラッシュしdeallocますが、たまにしかありません。

5 つのオブジェクトをキャッシュするための配列を 1 つ作成します。ユーザーが右または左のいずれかをタップすると、新しいオブジェクトが追加され、最後のオブジェクトが削除されます。アプリをテストしたところ、左右のボタンを 100 ~ 500 回タップすると、アプリがクラッシュしました。

メソッドでアプリがクラッシュしdeallocますが、すべてのオブジェクトが正しく割り当てられ、解放されます。

私のdealloc方法:

 - (void)dealloc
{
    [super dealloc];
    [_sImageLane release];
    [_sTipoLane release];
    [_maRecomended release];
    [_maProdcucts release]; // here crash in this line EXC_BAD_ACCESSE
}

何がうまくいかないのですか?

4

2 に答える 2

11

[super dealloc]最初の代わりに最後に置きます。

編集:これが発生する理由は、objc オブジェクトのライフサイクルが原因です。死ぬ時が来ると、オブジェクトにdeallocメッセージが送信されます。そのメソッド内で、オブジェクトはそれ自体をクリーンアップし、メッセージを継承チェーンに渡す必要があります (スーパークラスもそれ自体をクリーンアップする必要があるため)。[super dealloc]では、最後に正しく行うとどうなるでしょうか。

自己のリソースをクリーンアップ -> スーパーのリソースをクリーンアップ -> スーパーのスーパーのリソースをクリーンアップ -> その他 -> ランタイムによって回収されたメモリ。

いいですね、自分のやり方でやるとどうなりますか?

スーパーのリソースをクリーンアップ -> スーパーのスーパーのリソースをクリーンアップ -> など -> ランタイムによって回収されたメモリ -> 自分自身のリソースをクリーンアップ

おっと、あなたは回収されたメモリにアクセスし、それと対話しようとしています (つまり、EXC_BAD_ACCESS またはさらに悪いことに、別のオブジェクトのどこかでメモリをいじっていて、それを認識していません)。

NSObjectの dealloc メソッドは文字通りメモリを解放するfree()ため (おそらく を介して)、一度呼び出すと、未定義の危険な灰色の領域にいることになります。

于 2012-07-11T03:20:30.490 に答える
0

Xcode のどのバージョンを使用していますか? 新しいバージョンでは、メモリを割り当てたり解放したりする必要はありません。実行時にそれを行います。dealloc メソッドをコメントアウトしてコンパイルしてみてください。

于 2012-07-11T03:22:28.747 に答える