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

Qualcuno può aiutarmi a parlare di questo codice. Autorelando l'oggetto due volte quello che è successo. Quando eseguo il codice non ho ricevuto nessuno zombi. perché è così.Autoreleasing due volte un oggetto

risposta

12

L'oggetto viene rilasciato due volte quando il pool autorelease è distrutto, che è destinata probabilmente ad essere alla fine della iterazione del ciclo di esecuzione. Perché non si blocca, che NSString restituisce singleton per alcune istanze, ad esempio la stringa vuota che crei o stringhe letterali (dovresti NON dipendere da esso, questo è ciò che accade attualmente!), Questi oggetti non saranno deallocato e questo è il motivo per cui non si ottiene uno zombi.

+0

Cosa succede se non è una stringa, ma un'altra classe? – nekonari

3

Prima di tutto, non c'è motivo di chiamare autorelease due volte.

Una volta che un oggetto è contrassegnato come autorelease, richiamare nuovamente l'autorelease su di esso sarà semplicemente ignorato. Vedere https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html

Ma nel exmaple hai postato si sta creando una stringa vuota:

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

Poi si assegna un altra stringa ad esso:

str = @"hii"; 

Ciò significa che la prima stringa assegnato sarà solo una perdita, l'hai fatto autorelease in modo che venga pulito alla fine. Ma non c'è motivo di allocare la stringa nel primo.

si può solo fare:

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

"la chiamata di autorelease su di esso verrà ignorata" non vera. L'oggetto viene aggiunto due volte al pool di autorelease e verrà rilasciato due volte quando il pool viene scaricato. Ecco la documentazione: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html –