2014-12-11 7 views
7

Qualcuno può spiegarmi self.timer=nil vs [self.timer invalidate]?Qual è la diffrenza tra self.timer = nil vs [self.timer invalidate] in iOS?

Cosa succede esattamente nella posizione di memoria di self.timer?

Nel mio codice

self.timer=nil 

non si arresta il timer, ma

[self.timer invalidate] 

arresta il timer.

Se richiedi il mio codice, lo aggiornerò anch'io.

+0

[NSTimer] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/index.html) - "Nota in particolare che i cicli di esecuzione mantengono forti riferimenti al loro timer, quindi non è necessario mantenere il proprio riferimento forte a un timer dopo averlo aggiunto a un ciclo di esecuzione. " Quindi il tuo non è l'unico riferimento a quel timer, motivo per cui non lo stai impedendo di sparare. – Anurag

+0

Sì, ho ricevuto la mia risposta, thnaks – iNasir

risposta

8

Una volta che non è necessario eseguire il timer, annullare l'oggetto timer, quindi non è necessario annullare il riferimento.

Questo è ciò che la documentazione Apple dice: NSTimer

volta in programma un ciclo di esecuzione, i timer incendi al specificato intervallo fino a quando non viene invalidata. Un timer non ripetuto invalida lo stesso immediatamente dopo l'attivazione. Tuttavia, per un timer ripetuto, l'utente deve invalidare autonomamente l'oggetto timer chiamando il suo metodo invalido . La chiamata a questo metodo richiede la rimozione del timer dal ciclo di esecuzione corrente ; di conseguenza, dovresti sempre chiamare il metodo inverso dallo stesso thread su cui è stato installato il timer. L'invalidazione del timer lo disabilita immediatamente in modo che non sia più influenzare il ciclo di esecuzione. Il ciclo di esecuzione rimuove quindi il timer (e il riferimento forte allo al timer), appena prima del ritorno del metodo invalidato o in un secondo momento. Una volta invalidati, gli oggetti timer non possono essere riutilizzati.

+4

Dopo aver invalidato il timer, dovresti assegnare nil alla variabile altrimenti la variabile viene lasciata puntare a un timer inutile. – rmaddy

+2

La gestione della memoria e ARC non hanno nulla a che fare con il motivo per cui dovresti impostarlo su 'nil'. Dopo aver invalidato il timer, 'self.timer' fa ora riferimento a un timer inutile. Non dovrebbero essere fatti ulteriori tentativi per usare quel valore. Impostarlo su 'nil' assicura che qualsiasi ulteriore tentativo di accedere a' self.timer' comporterà 'nil'. – rmaddy

+0

Piuttosto, suggerirei di verificare la proprietà self.timer.isValid in condizione if, prima di utilizzare lo stesso punto valido – Mrunal

1

Innanzitutto, invalidate è un metodo di NSTimer classe che può usare per arrestare in esecuzione timer. Dove quando si assegna nil a qualsiasi oggetto, in un ambiente ARC la variabile rilascia l'oggetto.

sua importante per interrompere l'esecuzione del timer quando non è più necessario, quindi scriviamo [timer invalidate] e poi scriviamo timer = nil; per rendere sicuro che perde il suo indirizzo dalla memoria e successivamente è possibile ricreare il timer.

Problemi correlati