これは私がxcodeで書いたコードです
Foo * myFoo = [[Foo alloc] init] ;
[myFoo release] ;
[myFoo printMessage] ;
私が正しければ、それまでに myFoo の割り当てが解除されるため、printmessage 関数が呼び出されたときに実行時エラーが発生するはずです。しかし、 xcode では、コードは機能しており、印刷メッセージが呼び出されています.xcodeの設定が原因で問題ですか?
よろしくアビジット
これは私がxcodeで書いたコードです
Foo * myFoo = [[Foo alloc] init] ;
[myFoo release] ;
[myFoo printMessage] ;
私が正しければ、それまでに myFoo の割り当てが解除されるため、printmessage 関数が呼び出されたときに実行時エラーが発生するはずです。しかし、 xcode では、コードは機能しており、印刷メッセージが呼び出されています.xcodeの設定が原因で問題ですか?
よろしくアビジット
解放されたメモリにアクセスすることで、未定義の動作を呼び出しています。
クラッシュするかもしれませんし、正常に動作するかもしれませんし、踊るユニコーンが鼻から飛び出すかもしれません。
コードの開発中にメモリ エラーを検出するには、NSZombie を有効にする必要があります。次の手順を参照してください。
http://www.cocoadev.com/index.pl?NSZombieEnabled
アップデート
なぜこのように動作するのか疑問に思うかもしれません.有効でないメモリにアクセスしようとすると、OS は常にエラーをスローするはずです.
常にエラーが発生するとは限らない理由 (および動作が定義されていない理由) は、すべてのアクセスでメモリが有効であることを確認すると、パフォーマンスが低下するためです。発生してはならないことをチェックするためだけに、コードの実行が遅くなります。
したがって、開発中にこれらすべてのエラーをトラップして、エンド ユーザーにエラーが発生しないように注意する必要があります。NSZombies は、それらを見つけるための最適なツールです。
もう1つのポイント-xcodeで「ビルドと分析」を行うと、ビルド時にこのエラーが見つかる場合もあります。確かに、静的アナライザーはビルド時にいくつかのメモリ エラーを検出します。
オブジェクトの解放は瞬間的ではなく、オブジェクトは解放されますが、解放メッセージを送信したときかどうかはわかりません。あなたが経験している行動は正常です。