7
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);      

誰かが私がこのコードについて話すのを手伝ってくれますか?何が起こるかを2回オブジェクトを自動解放します。コードを実行したとき、ゾンビは発生しませんでした。なぜそうなのか。

4

2 に答える 2

13

自動解放プールが破棄されると、オブジェクトは 2 回解放されます。これは、おそらく実行ループの反復の最後になります。クラッシュしない理由は、NSStringいくつかのインスタンスに対してシングルトンを返すことです。たとえば、作成した空の文字列や文字列リテラル (それに依存するべきではありません。それが現在起こっていることです!)、これらのオブジェクトは割り当てが解除されず、これがゾンビが出ない理由です。

于 2012-07-02T10:31:37.173 に答える
3

まず、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);
于 2012-07-02T10:31:22.640 に答える