2011-02-04 6 views
6

He adjuntado un UIGestureRecognizer a un UIView. ¿De quién es la responsabilidad de liberar esto durante dealloc?¿Soy responsable de lanzar un gesto Reconocimientos de UIView en dealloc?

Específicamente:

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)]; 

[self.view addGestureRecognizer:t]; 
[t release]; 

Así, self.view actualmente con la retención planta del gestureRecognizer.

Actualización Debería haber sido más claro. Mi pregunta tiene que ver con el método views dealc. ¿La clase de superclase de la vista maneja la liberación del gestureRecognizer cuando se lanza la vista? Actualmente asumo que es el caso.

Respuesta

1

La regla general es que llame al release cada vez que llame al alloc, new o copy.

Dado que ha llamado a alloc, su código no se está liberando demasiado ni está filtrando nada.

Mientras que usted podría AutoRelease el reconocedor gesto, yo no debido a la liberación explícita objetos, siempre que sea posible, es una mejor gestión de memoria. (Los objetos lanzados automáticamente no se liberan hasta que se vacía el grupo de autorrelease.)

2

Tu código es correcto.

La vista toma posesión del recogigador de gestos con [self.view addGestureRecognizer:t].

Se podría poner en orden su código por autoreleasing t al crearlo:

UITapGestureRecognizer *t = [[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)] autorelease]; 
[self.view addGestureRecognizer:t]; 

Esto significaría que toda la propiedad de t se maneja en un solo lugar lo que reduce la posibilidad de introducir problemas si el código se modifed.

+0

No es una buena costumbre llamar a la liberación automática de todos sus objetos en lugar de soltarlos. – Tieme

+0

@Tieme No estoy de acuerdo. Mantiene todo el código de administración de memoria en un solo lugar, lo que mejora la legibilidad y, por lo tanto, reduce el potencial de fugas debido a olvidarse de "liberar". La liberación retardada no afectará a la marca de la marea alta de la memoria porque el objeto persistirá después de que este método salga de todos modos. ¿Cuál es su razón para afirmar que usar la liberación automática no es un buen hábito? –

+0

Estoy de acuerdo con usted en este ejemplo. Aquí está bien llamar a liberación automática. Pero aún no es una buena costumbre dejar de autorrealizar automáticamente los objetos, ya que al final agregará algo de sobrecarga a la administración de su memoria. – Tieme

Cuestiones relacionadas