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
fonte
2011-10-26 04:40:12
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) –
Martin, una piccola correzione: è EXC_BAD_ACCESS (EXC come eccezione). – bneely
Grazie per la chiara spiegazione – Stavash