NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);
誰かが私がこのコードについて話すのを手伝ってくれますか?何が起こるかを2回オブジェクトを自動解放します。コードを実行したとき、ゾンビは発生しませんでした。なぜそうなのか。
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);
誰かが私がこのコードについて話すのを手伝ってくれますか?何が起こるかを2回オブジェクトを自動解放します。コードを実行したとき、ゾンビは発生しませんでした。なぜそうなのか。
自動解放プールが破棄されると、オブジェクトは 2 回解放されます。これは、おそらく実行ループの反復の最後になります。クラッシュしない理由は、NSString
いくつかのインスタンスに対してシングルトンを返すことです。たとえば、作成した空の文字列や文字列リテラル (それに依存するべきではありません。それが現在起こっていることです!)、これらのオブジェクトは割り当てが解除されず、これがゾンビが出ない理由です。
まず、autorelease を 2 回呼び出す理由はありません。
オブジェクトが autorelease としてマークされると、再度 autorelease を呼び出しても無視されます。https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.htmlを参照してください。
しかし、あなたが投稿した例では、空の文字列を作成しています:
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
次に、別の文字列を割り当てます。
str = @"hii";
これは、割り当てた最初の文字列がリークすることを意味します。自動解放したため、最後にクリーンアップされます。しかし、文字列を最初に割り当てる理由はありません。
あなたはただ行うことができます:
NSString *str =@"hii";
NSLog(@"%@",str);