6

Estoy haciendo un juego para iPhone. Quiero liberar todos los objetos que han sido asignados o retenidos. En la función dealloc estoy liberando todos esos objetos, pero luego me di cuenta de que a veces termino liberando objetos cuando aún no han sido asignados. Así que pensé que necesitaba comprobar si su retainCount es mayor que cero o no antes de que lo libere.¿Cuántas veces lanzo un objeto asignado o retenido?

Mi pregunta es:

No acabo de comprobar si el retainCount es mayor que cero y luego soltarlo?

if([bg retainCount]!=0) 
{ 
    [bg release]; 
} 

o

¿Debo liberar tantas veces como su retainCount

while([bg retainCount]!=0) 
{ 
    [bg release]; 
} 

Gracias por su ayuda!

+23

El 'retainCount' de cualquier objeto es ** nada de su negocio **. Está allí como una ayuda de depuración, pero nada más. El código de producción nunca debería depender de él. – Sven

+9

BTW - no es que haga que el código sea correcto, pero, por definición, 'retainCount' nunca puede devolver 0 porque el objeto ya ha sido desasignado por el momento en que ocurre ..... – bbum

+0

Además, intente usar" Build & Analizar "(es decir, el analizador Clang). Puede que te indique dónde te va mal. –

Respuesta

77

No utilice -retainCount.

El conteo absoluto de retención de un objeto no tiene sentido.

Debe llamar al release exactamente la misma cantidad de veces que causó que se retenga el objeto. Nada menos (a menos que te gusten las fugas) y, desde luego, nada más (a menos que te gusten los bloqueos).

Consulte el Memory Management Guidelines para más detalles.

+10

Deberías tener ese tatuaje en alguna parte. –

+4

@bbum: rdar: // 8122368 (http://openradar.appspot.com/8122368 para todos los que no somos amigos de Apple) –

+0

No he usado retainCount hasta ahora pero me preguntaba si debería hacerlo. Gracias por aclarar eso :) Estoy asignando una imagen de primer plano cuando el jugador muere en el juego. Ahora, si el jugador completa el nivel sin morir todo el nivel, entonces, en el trato, ¿cómo puedo comprobar si debo liberar el primer plano o no? ¿Solo uso una bandera para verificar si se usó o no el foregrounf? – abhinav

Cuestiones relacionadas