2010-04-18 10 views
7

A veces necesito averiguar si realmente se lanzará un objeto. Podría utilizar instrumentos por supuesto, pero eso lleva mucho tiempo, y tengo que buscar en millones de objetos, por lo que yo solía hacer esto:¿Es seguro anular `release` para la depuración?

-(void)release { 
    NSLog(@"I'm released"); 
    [super release]; 
} 

pero el problema es: es este seguro hacerlo? ¿Puedo obtener algún problema cuando anulo -(void)release. Además, ¿es realmente void? ¿Y si construyo mi aplicación para distribución, pero por accidente la dejo ahí? ¿O es solo seguro? Gracias

+0

¿Qué quiere decir con "realmente lanzado"? ¿Crees que a veces [la publicación foo] no hace que se envíe el mensaje de lanzamiento? – JeremyP

+0

@JeremyP '[[[foo alloc] init] liberación automática];' ?? –

+0

Ya veo. No quiere ver si el método de lanzamiento funciona, pero si el objeto alguna vez se libera. Puede ser retenido y liberado muchas veces a lo largo de su vida, por lo que depurar el método de lanzamiento probablemente no sea tan útil. Probablemente desee consultar la respuesta de Laurent Etiemble a continuación. – JeremyP

Respuesta

19

Está bien, pero por favor restrinja solo la depuración.


No es void, pero oneway void.

-(oneway void)release { 
    NSLog(@"I'm released"); // <-- remeber the @. 
    [super release]; 
} 

Nota que si sólo para anular este NSObject, a continuación, los -release mensajes enviados a "contenedores con puente de teléfono gratuitos" (por ejemplo NSCFArray, etc.) no se alcanzará, ya que también ha redefinido -release remitir a CFRelease.

+3

+1 por mencionar sobre 'unidireccional' – Eonil

5

El mensaje de liberación solo decrementa el recuento de referencias de la instancia.

Si desea saber si la instancia ha sido puesto en libertad, entonces lo mejor es para anular el mensaje dealloc:

- (void)dealloc { 
    NSLog(@"I am deallocated"); 
    [super dealloc]; 
} 

usarlo sabiamente.

Cuestiones relacionadas