una versión simplificada de respuesta aceptada de Jonathan Grynspan:
El retain
no es para la variable de que apunta a un objeto. Esa variable será durará para siempre porque es estática. El retain
es para el objeto al que apunta la variable. Sin el retain
, el objeto podría (y debería) ser desasignado. Entonces tienes una variable que apunta a algo que causará un sigabrt
. Esta variable que apunta a ninguna parte se conoce como un "puntero colgante".
Para el contexto ARC, lo mejor que puede hacer es declarar la variable estática tan fuerte, así que algo como esto:
static ThatClass * __strong thatStaticVariable;
Esto asegura que el objeto que thatStaticVariable
puntos que van a ser un objeto válido (es decir, , nunca se desasigna) una vez asignado. Sin embargo, no tienen necesariamente la palabra clave __strong en absoluto, porque es el valor por defecto (por lo sayeth the docs, gracias a @zpasternack), por lo que sólo tiene que utilizar
static ThatClass *thatStaticVariable;
y ya está bueno.
Nota: forever = while la aplicación se está ejecutando
Jonathan is right! ¿Qué sucede si el argumento aprobado se encuentra en un grupo de autorrelease y se lanzará automáticamente justo después de que se llame al método? -> acceder al puntero estático causará un error (EXEC_BAD_ACCESS principalmente) –
Martin, una pequeña corrección: eso es EXC_BAD_ACCESS (EXC como en la excepción). – bneely
Gracias por la explicación clara – Stavash