2011-08-03 7 views
0

私は解放しようとするNSStringを持っています。EXEC_BAD_ACCESSに割り当てられたアドレスを持つNSStringを解放しようとしたとき

問題は、リリースしようとしたときにEXC_BAD_ACCESSが表示されることがあります。 NSStringにはアドレスが割り当てられています(下のページで0xABCDEFにメモリが割り当てられています)。

何かが存在する場合に、再調整中にこの問題を回避するにはどうすればよいですか?

+0

私はいくつかのコードスニペットを与えることができますか?Bczこれは多くのpbmのようなものかもしれません。 –

+0

あなたはそれが2回リリースされているかどうかを確認しませんでした.... – booleanBoy

答えて

2

オブジェクトを解放することはできますが、オブジェクトへのポインタには引き続き値を設定できます。ガーベッジの値(つまり、dangling pointer)だけです。最初のオブジェクトを解放し、その後nilへのポインタを設定

[myObject release]; 
myObject nil; 

:次のような多くのコードを参照してください理由です

。そうすれば、あなたのアプリで起こっているように、クラッシュするのではなく、それに送信されたメッセージは黙って失敗します(Objective-Cのnilオブジェクトにメッセージを送信することは安全です)。

あなたはポインタをチェックしているので、私はあなたのメモリ管理との奇妙な何かをやっていると思われます。しないでください。 Memory Management Rulesに従って、所有しているオブジェクトだけを解放してください。

+1

+1私は通常、次のようにマクロを作成します。 '#define SXRelease(obj)[obj release]; obj = nil'である。私は 'free()'と同じです: '#define SXFree(ptr)free(ptr); ptr = NULLである。 –

+1

あなたはバグがあり、varをnilに設定するだけでそれをマスキングしています。開発用のMalloc Scribbleを有効にしてバグを修正する方がよいでしょう。 – hooleyhoop

1

すでにリリースされている文字列には[release]が呼ばれている可能性があります。どのようにそれを割り当てていますか?オブジェクトが解放されるか、またはオートリリースされると、自動的にnil(0x0)に設定されません。

[[NSString alloc] initWithSomething]は、リリースコールが必要です。

[NSString stringWithSomething]は、慣習的に、オートリリースされていません。

+0

NSStringのドキュメントで "initWithSomething"を見つけることができません。

関連する問題