Eventuali duplicati:
Why do weak NSString properties not get released in iOS?Objective-C: attritube debole non funzionano come previsto
Sono un novizio di Objective C e ho alcune domande che mi non posso rispondere a me stesso Ho un blocco di codice per la variabile test __weak (sto usando ARC, ovviamente):
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
myString = nil; //<-- release the NSString object
NSLog(@"string: %@", weakString);
L'uscita dei codici di cui sopra è come previsto, poiché weakString è una variabile debole:
2013-01-02 11:42:27.481 ConsoleApp[836:303] string: (null)
Ma quando ho modificato il codice a questo:
NSString *myString = [[NSString alloc] initWithFormat:@"John"];
NSString * __weak weakString = myString;
NSLog(@"Before: %@", weakString); //<--- output to see if the __weak variable really works.
myString = nil;
NSLog(@"After: %@", weakString);
l'uscita non è del tutto quello che mi aspettavo:
012.351.641.061.2013-01-02 11:46:03.790 ConsoleApp[863:303] Before: John
2013-01-02 11:46:03.792 ConsoleApp[863:303] After: John
L'output di quest'ultimo NSLog deve essere stato (nil) anziché "John". Ho provato a cercare in molti documenti ma non ho trovato la risposta per questo caso. Qualcuno può dare una spiegazione ragionevole? Grazie in anticipo.
@jrturton: Non penso che questo sia un duplicato della domanda collegata. Il problema era l'utilizzo di una costante 'NSString' che non partecipava alla solita gestione della memoria a causa delle ottimizzazioni delle prestazioni. Il poster qui usa 'initWithFormat' per evitare esattamente questo problema. – zoul
Ho letto (ma non ho potuto trovare questa volta) un altro dupe di questo in cui l'ottimizzazione di NSString impedisce questo funzionamento. Se l'OP tenta un diverso tipo di oggetto, sospetto che tutto funzioni come previsto. Continuerò a cercare ... – jrturton
Anche qui: http://stackoverflow.com/questions/9202810/lifetime-of-weak-local-variables-with-arc – jrturton