2013-05-09 10 views
5

私が書く場合は - 私が書く場合NSObjectがリリースされましたが、NSStringはNSArrayではありませんか?

NSObject *a = [[NSObject alloc] init]; // or UIView or something 
[a release]; 
NSLog(@"a = %@", a); // causes EXC_BAD_ACCESS, fine 

しかし、 -

NSArray *a = [[NSArray alloc] init]; // or NSString or NSDictionary 
[a release]; 
NSLog(@"a = %@", a); // no crash, prints empty array or string 

がリリースだから後者の場合は、不正なアクセスが発生しないのはなぜ?

答えて

8

リリースされたオブジェクトにアクセスしても、すぐにアプリケーションをクラッシュさせる必要はありません。

オブジェクトを解放しても、メモリは同じ内容でしばらくの間そこにとどまります。オブジェクトメモリがすでに他のオブジェクトによって上書きされた場合にのみクラッシュします。上書きされたメモリであっても、クラッシュする必要はありません。あなたは非常に奇妙な振る舞いしか得られません(例えば、オブジェクトがNSStringの場合、それは異なる内容を得ることができます)。

基本的に、この動作は完全にランダムです。解放されたオブジェクトを使用すると、すぐに、または5分または2時間でアプリケーションがクラッシュする可能性があります。

編集:面白いコメントをマーティンRから 感謝。 [[NSArray alloc] init]で作成された配列、つまり空の不変配列は常に同じインスタンスを返すようです。つまり、あなたのreleaseは割り当て解除されません。しかし、この動作は簡単に変更することができ、コンパイラやOSのバージョンによって異なる場合があります。

+0

あなたは私より速く、私はまったく同じ方法で答えるつもりでしたが、私は1単語も入力しませんでした。 +1 – borrrden

+0

しかし、NSObjectやUIViewなどをリリースすることは間違いなく即座にクラッシュしますが、NSArrayやNSStringなどは間違いなくすぐにクラッシュすることはありません。だからいくつかの違いは、メモリの使用、配列または文字列のリリースのケースにある必要があります。それは何ですか? – user1559227

+0

**ランダム**を参照してください。この場合、NSObjectではクラッシュしますが、NSArrayではクラッシュしません。異なるオプションでコンパイルすると、そのように動作しない可能性があります。 OSがどのようにメモリを使用するかは、多くの要因によって異なります。これは、* released *と* deallocated *の違いです。 – borrrden