2011-02-04 10 views
6

Ho allegato un UIGestureRecognizer a un UIView. Di chi è la responsabilità di rilasciare questo durante dealloc?Sono responsabile del rilascio di un gesture di riconoscimento di UIView in dealloc?

In particolare:

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

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

Quindi, self.view ha attualmente ritenzione pianta del gestureRecognizer.

Aggiornamento avrei dovuto essere più chiaro. La mia domanda ha a che fare con il metodo dealloc viste. La superclasse della vista gestisce il rilascio di gestureRecognizer quando viene rilasciata la vista. Attualmente presumo che sia così.

risposta

1

La regola generale è che si chiama release ogni volta che si chiama alloc, new o copy.

Poiché hai chiamato alloc, il tuo codice non sta rilasciando o perdendo nulla.

Mentre si potrebbe autorelease vostro riconoscitore gesto, avrei non perché rilasciare in modo esplicito gli oggetti, ove possibile, una migliore gestione della memoria. (Oggetti autoreleased non vengono rilasciati fino a quando la piscina autorelease viene svuotato.)

2

Il tuo codice è corretto.

La vista assume la proprietà del recoginzer gesto con [self.view addGestureRecognizer:t].

Si potrebbe riordinare il codice da autoreleasing t al momento della creazione:

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

Ciò significherebbe che tutti i diritti di proprietà dei t viene gestito in un unico luogo riducendo così il potenziale per l'introduzione dei problemi se il codice viene modifed.

+0

Non è una buona abitudine di chiamare autorelease su tutti i vostri oggetti invece di liberare voi stessi. – Tieme

+0

@Tieme Non sono d'accordo. Mantiene tutto il codice di gestione della memoria in un posto che migliora la leggibilità e quindi riduce il rischio di perdite dovute alla dimenticanza di 'release'. Il rilascio ritardato non influirà sul limite massimo della memoria perché l'oggetto persisterà dopo l'uscita di questo metodo. Quali sono le ragioni per cui affermare che l'uso dell'autelease non è una buona abitudine? –

+0

Sono d'accordo con te su questo esempio. Qui va bene chiamare autorelease. Ma non è ancora una buona abitudine portare sempre a termine l'autoreleasing degli oggetti, perché alla fine aggiungerà un po 'di overhead alla gestione della memoria. – Tieme

Problemi correlati