2011-10-17 26 views
5

Necesito poder verificar si ya he lanzado una variable en Object-c. Traté de verificación si se ha cambiado a nulo:¿Cómo puedo verificar si se lanza un objeto?

//Checks if buildview is null and returns respective output 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//allocates memory and initalizes value 
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

//Releases the view 
[BuildView release]; 

//Checks if buildview is null and returns respective output again 
if(BuildView == NULL) 
    NSLog(@"Build View Value (pointer): Null"); 
else 
    NSLog(@"Build View Value (pointer): Not Null"); 

Los resultados fueron los siguientes:

Build View Value (pointer): Null 
Build View Value (pointer): Not Null 
Build View Value (pointer): Not Null 

¿Hay alguna forma más fácil comprobar si se cancela la asignación?

+0

Lo que parece estar pidiendo no es si el objeto ha sido puesto en libertad, sino más bien si ha sido desasignado. – PengOne

+1

posible duplicado de [¿Cómo determinar si tengo un puntero al objeto liberado?] (Http://stackoverflow.com/questions/12280799/how-to-determine-if-i-have-a-pointer-to-released -objeto) – OrangeDog

Respuesta

4

Probablemente quiera decir desasignado (destruido), no publicado. Siendo liberado no significa ser desasignado, ese es el punto de referencia de la administración de memoria contada. Ser liberado no es un estado, no se puede verificar; ser destruido es

Si quiere decir desasignado, entonces no, no hay ninguno. Se llama referencia débil, y Objective-C no las tiene para el recuento de referencias. Cuando un objeto es desasignado, no se hace nada automáticamente con los punteros; se convierten en punteros colgantes.

Una técnica es hacer que el objeto envíe una notificación durante la desasignación, de modo que todo lo que contenga un puntero pueda restablecerlo a cero.

En general, debe diseñar su programa de forma que no se vuelva a utilizar ningún puntero de objeto después de llamar al release. En el código de muestra que ha proporcionado, no debe usar BuildView nuevamente para nada más que para asignar un nuevo valor.

+0

Cabe señalar que, con fines históricos, esta respuesta ya no es correcta. Objective-C tiene referencias débiles, y de hecho, siempre lo hizo, con suficiente pirateo de tiempo de ejecución. Sin embargo, para la versión oficial, requieren iOS 5 y superior. –

6

Normalmente, no debería necesitar comprobar si un puntero apunta a un objeto desasignado: Debe saber :) Sus variables solo tienen una dirección de memoria. Si el contenido de la memoria a la que apunta la variable está desasignado, el valor de su variable (que contiene la dirección) no se establecerá mágicamente a NIL o NULL. Por lo tanto, debería reconsiderar su diseño si considera que es necesario verificar si un puntero apunta a un espacio de direcciones que ya se ha liberado/desasignado.

Durante el tiempo de desarrollo, puede hacer cosas como activar NSZombies o utilizar los instrumentos para averiguar dónde están asignados o desasignados los objetos.

actualización 26/06/2015: Cuando se utiliza weak punteros en OS X 10.7 y superior, y en iOS 5 o superior, automáticamente se establecerá en nil cuando se suelta el objeto referenciado. Consulte https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References

0

Después de liberar un objeto, el valor de ese objeto no se establecerá en nil.

+2

llamando a 'retainCount' en el objeto destruido le dará un bloqueo u otro comportamiento indefinido, no cero. – hamstergene

+0

De hecho, el resultado más probable en esa muestra de código particular es que 'retainCount' devolvería 1 ** ¡incluso cuando fue desasignado **! – Chuck

Cuestiones relacionadas