2011-06-11 21 views

risposta

36

Sto assumendo vuoi dire un puntatore oggetto statico, come ad esempio static NSString *foobar;.

Tali variabili hanno una durata purché l'applicazione, ma le variabili di cui stiamo parlando sono solo. In Objective-C, gli oggetti sono sempre allocati dinamicamente e quindi li indirizziamo sempre con un puntatore al loro tipo, ma i dati sottostanti per un oggetto sono ancora presenti nell'azzerato jolly blu dinamicamente assegnato.

È comunque necessario mantenere l'oggetto perché, mentre il puntatore all'oggetto non potrà mai andare fuori portata, l'oggetto stesso può essere deallocato come qualsiasi altro oggetto, e così il puntatore finirà che punta a spazzatura, o peggio, un altro oggetto non correlato.

+4

Jonathan ha ragione! Cosa succede se l'argomento passato si trova in un pool di autorelease e verrà automaticamente rilasciato dopo aver chiamato il metodo ?! -> l'accesso al puntatore statico causerà un errore (EXEC_BAD_ACCESS principalmente) –

+0

Martin, una piccola correzione: è EXC_BAD_ACCESS (EXC come eccezione). – bneely

+0

Grazie per la chiara spiegazione – Stavash

16

Una versione semplificata di risposta accettato di Jonathan Grynspan:

Il retain non è per la variabile che punta a un oggetto. Quella variabile sarà valida per sempre perché è statica. Lo retain è per l'oggetto a cui punta la variabile. Senza lo retain l'oggetto potrebbe (e dovrebbe) essere deallocato. Quindi hai una variabile che punta a una cosa che causerà un sigabrt. Questa variabile che punta da nessuna parte è conosciuta come un "puntatore ciondolante".

Per il contesto ARC, la cosa migliore da fare è dichiarare la variabile statica forte, in modo da qualcosa di simile:

static ThatClass * __strong thatStaticVariable; 

Questo assicura che l'oggetto che thatStaticVariable punti saranno un oggetto valido (vale a dire , non viene mai deallocato) una volta assegnato. Tuttavia, in realtà non hanno bisogno la parola __strong a tutti, perché è il default (così sayeth the docs, grazie alla @zpasternack), quindi basta usare

static ThatClass *thatStaticVariable; 

e si sta bene.

Nota: per sempre = mentre l'applicazione è in esecuzione

+5

In ARC, qualsiasi oggetto conservabile senza un qualificatore esplicito di proprietà è implicitamente __strong, quindi diciamo [i documenti] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference). – zpasternack