2011-06-11 17 views

Respuesta

36

Asumo que quiere decir un puntero objeto estático, como static NSString *foobar;.

Tales variables de hecho tienen una vida útil mientras la aplicación, pero las variables de las que hablamos son punteros solo. En Objective-C, los objetos siempre se asignan dinámicamente, por lo que siempre los direccionamos con un puntero a su tipo, pero los datos subyacentes para un objeto aún están presentes en el azul salvaje dinámicamente asignado.

aún debe retener el objeto porque, mientras que la puntero al objeto nunca pasan de alcance, el objeto en sí mismo puede cancelar la asignación al igual que cualquier otro objeto, por lo que el puntero se acabe apuntando a la basura, o peor, otro objeto no relacionado.

+4

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) –

+0

Martin, una pequeña corrección: eso es EXC_BAD_ACCESS (EXC como en la excepción). – bneely

+0

Gracias por la explicación clara – Stavash

16

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

+5

En ARC, cualquier objeto retenible sin un calificador de propiedad explícita es implícitamente __truerte, por lo que dice [los documentos] (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.inference). – zpasternack

Cuestiones relacionadas