5

私が書くなら -

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

2番目のケースは、リリースされているのに、なぜアクセス不良が発生しないのですか?

4

1 に答える 1

8

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

オブジェクトを解放しても、メモリは同じ内容でしばらくそこにとどまります。オブジェクト メモリが他のオブジェクトによって既に上書きされている場合にのみ、クラッシュが発生します。また、メモリが上書きされても、クラッシュする必要はないことに注意してください。非常に奇妙な動作しか取得できません (たとえば、オブジェクトが の場合、NSString別のコンテンツを取得できます)。

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

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

于 2013-05-09T09:56:24.963 に答える