2012-07-02 17 views
7

Kann mir jemand helfen, über diesen Code zu erzählen. Autoreleasing das Objekt zweimal, was passiert ist. Wenn ich den Code ausführe, habe ich keinen Zombie bekommen. warum es so ist.Autoreleasing zweimal ein Objekt

Antwort

12

Das Objekt zweimal freigegeben wird, wenn der Autofreigabepool zerstört wird, was wahrscheinlich am Ende des Laufes Schleifeniterationslatenzzeit sein wird. Warum es nicht abstürzt, ist, dass NSString Singletons für einige Instanzen zurückgibt, zum Beispiel die leere Zeichenfolge, die Sie erstellen oder Stringliterale (Sie sollten NICHT davon abhängen, das ist gerade was passiert!), Werden diese Objekte nicht sein freigegeben und deshalb bekommst du keinen Zombie.

+0

Was ist, wenn es keine Zeichenfolge, sondern eine andere Klasse ist? – nekonari

3

Zuerst gibt es keinen Grund, Autorelease zweimal aufzurufen.

Sobald ein Objekt als Autorelease markiert ist, wird das erneute Aufrufen der Autorelease einfach ignoriert. Siehe https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

Aber in der exmaple geschrieben Sie eine leere Zeichenfolge erstellen:

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

Sie dann eine andere Zeichenfolge zuweisen:

str = @"hii"; 

Dies bedeutet, dass die erste Zeichenfolge zugeteilt wird nur undicht sein, du hast es freigegeben, damit es am Ende aufgeräumt wird. Aber es gibt keinen Grund, die Saite an erster Stelle zuzuordnen.

Sie könnten nur tun:

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

"Autorelease wird erneut ignoriert werden nur ignoriert" unwahr. Das Objekt wird zweimal zum Pool für die automatische Freigabe hinzugefügt und zweimal freigegeben, wenn der Pool geleert wird. Hier ist die Dokumentation: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html –