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

Czy ktoś może mi pomóc powiedzieć o tym kodzie. Autoodbladkowanie obiektu dwukrotnie, co się wydarzy. Kiedy uruchomiłem kod, nie dostałem żadnego zombie. dlaczego tak jest.Autoodbladkowanie dwukrotnie obiektu

Odpowiedz

12

Obiekt zostanie wydana dwa razy, gdy pula autorelease jest zniszczona, który prawdopodobnie będzie w końcu iteracji pętli run. Dlaczego to się nie psuje to, że NSString zwraca singletons dla niektórych instancji, na przykład pusty łańcuch, który tworzysz, lub literały łańcuchowe (powinieneś/powinnaś polegać na tym, co aktualnie się dzieje!), Te obiekty nie będą zwolniony i dlatego nie dostajesz zombie.

+0

Co jeśli nie jest to ciąg znaków, ale inna klasa? – nekonari

3

Po pierwsze, nie ma powodu, aby dwukrotnie wywoływać autorelease.

Gdy obiekt zostanie oznaczony jako autorelease, ponowne wywołanie autorelease na nim będzie po prostu ignorowane. Zobacz https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

Ale w exmaple ty pisał tworzysz pusty ciąg:

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

Następnie można przypisać inny ciąg do niego:

str = @"hii"; 

Oznacza to, że pierwszy ciąg ty przydzielone zostanie tylko przeciek, autoreasowałeś go, aby został wyczyszczony na końcu. Ale nie ma powodu, aby przyznawać ciąg na pierwszym miejscu.

Można po prostu zrobić:

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

"ponowne wywołanie autorelease po prostu zostanie zignorowane" nieprawdziwe. Obiekt zostanie dodany dwukrotnie do puli autorelease i zostanie zwolniony dwa razy, gdy pula zostanie opróżniona. Oto dokumentacja: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html –

Powiązane problemy