4

これは私がxcodeで書いたコードです

Foo * myFoo = [[Foo alloc] init] ;

[myFoo release] ;
[myFoo printMessage] ;

私が正しければ、それまでに myFoo の割り当てが解除されるため、printmessage 関数が呼び出されたときに実行時エラーが発生するはずです。しかし、 xcode では、コードは機能しており、印刷メッセージが呼び出されています.xcodeの設定が原因で問題ですか?

よろしくアビジット

4

2 に答える 2

7

解放されたメモリにアクセスすることで、未定義の動作を呼び出しています。

クラッシュするかもしれませんし、正常に動作するかもしれませんし、踊るユニコーンが鼻から飛び出すかもしれません。

コードの開発中にメモリ エラーを検出するには、NSZombie を有効にする必要があります。次の手順を参照してください。

http://www.cocoadev.com/index.pl?NSZombieEnabled

アップデート

なぜこのように動作するのか疑問に思うかもしれません.有効でないメモリにアクセスしようとすると、OS は常にエラーをスローするはずです.

常にエラーが発生するとは限らない理由 (および動作が定義されていない理由) は、すべてのアクセスでメモリが有効であることを確認すると、パフォーマンスが低下するためです。発生してはならないことをチェックするためだけに、コードの実行が遅くなります。

したがって、開発中にこれらすべてのエラーをトラップして、エンド ユーザーにエラーが発生しないように注意する必要があります。NSZombies は、それらを見つけるための最適なツールです。

もう1つのポイント-xcodeで「ビルドと分析」を行うと、ビルド時にこのエラーが見つかる場合もあります。確かに、静的アナライザーはビルド時にいくつかのメモリ エラーを検出します。

于 2010-09-27T12:15:40.233 に答える
0

オブジェクトの解放は瞬間的ではなく、オブジェクトは解放されますが、解放メッセージを送信したときかどうかはわかりません。あなたが経験している行動は正常です。

于 2010-09-27T12:19:28.447 に答える