2012-07-02 4 views
7
NSString *str = [[[[NSString alloc]init]autorelease]autorelease]; 
str = @"hii"; 
NSLog(@"%@",str);  

このコードについて教えてもらえますか?何が起こったのかをオブジェクトを2回オートリリースする。私がコードを実行するとき、私はゾンビを手に入れませんでした。なぜそうだ。オブジェクトを2回オートリースする

答えて

12

自動解放プールは、おそらく実行ループ反復の終わりになるだろうされ、破壊された場合、オブジェクトが二回リリースされます。なぜそれがクラッシュしないのですか?NSStringは、あなたが作成する空文字列や文字列リテラルなど、いくつかのインスタンスでシングルトンを返します(でなければなりません。は現在の状況です)!割り当てが解除され、これがゾンビを取得しない理由です。

+0

文字列ではなく、別のクラスの場合はどうなりますか? – nekonari

3

まず、autoreleaseを2回呼び出す理由はありません。

オブジェクトがautoreleaseとしてマークされると、再びautoreleaseを呼び出しても無視されます。 を参照してくださいhttps://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

しかし、あなたは空の文字列作成されている投稿exmapleに:

NSString *str = [[[[NSString alloc]init]autorelease]autorelease]; 

を次に、あなたがそれに他の文字列を割り当てます。

str = @"hii"; 

これは、最初の文字列あなたを意味割り当てられたものがリークするだけで、あなたはそれを自動解放して、最後にはクリーンアップされます。しかし、文字列を最初の場所に割り当てる理由はありません。

あなただけ行うことができます:

NSString *str [email protected]"hii"; 
NSLog(@"%@",str); 
+4

「autoreleaseを再度呼び出しても無視されます。オブジェクトは自動解放プールに2回追加され、プールが排水されると2回解放されます。ドキュメントは次のとおりです:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html –

関連する問題