2014-04-30 11 views
5

In iOS, faccio scorrere dal ViewController corrente a quello precedente, ma non entra in dealloc.iOS - viewController Il metodo dealloc non viene chiamato dopo il popping alla vista precedenteController

È perché c'è un altro puntatore che punta verso il viewController corrente, o in un diverso viewController o in quello corrente?

Questo è dove ho pop alla vista precedente:

- (IBAction)fileUploadCancelTouched:(UIButton *)sender { 

    [self.fileToUpload cancel]; 

    [self.view hideToastActivity]; 
    [self.greenprogressBar removeFromSuperview]; 
    [self.subView removeFromSuperview]; 
    self.fileUploadCancelButton.hidden = YES; 
    if (self.commandComeBackToFinalScreen == 1) { 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
} 

Questa è la mia funzione di dealloc:

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 

    self.greenprogressBar = nil; 
    self.fileUploadCancelButton = nil; 
    self.fileToUpload = nil; 
    [buttonHome_ release]; 
    [buttonTestMeAgain_ release]; 
    [buttonMarkMyTest_ release]; 
    [examId_ release]; 
    [sender_ release]; 
    self.ob = nil; 
    [_fileUploadCancelButton release]; 
    [super dealloc]; 
} 
+0

Fornire un codice per comprendere meglio la domanda. –

risposta

6

Controllare per accertarsi che ARC non è abilitata nel progetto. Se non è abilitato ARC, chiamare dealloc a meno che il tuo codice non mantenga il tuo controller di visualizzazione. Dovresti controllare attraverso lo Instruments tool se i tuoi comandi pop riducono la memoria o meno.

Potrebbero esserci altri motivi come menzionato in un'altra risposta che sto postando qui sotto: Il motivo ovvio è che qualcosa sta mantenendo il tuo viewController. Dovrai guardare da vicino il tuo codice. Fai qualcosa che nella tua classe utilizza i delegati, poiché a volte mantengono il delegato. NSURLConnection manterrà la tua classe, così come NSTimer. Puoi sparpagliare codice nella tua classe e registrare il conteggio dei ritardi della tua classe, e cercare di scoprire dove. Nel codice che hai mostrato fino ad ora il mantenimento potrebbe essere solo 1, poiché la classe viene mantenuta solo dal controller di navigazione.

Inoltre, prima di aprire la vista, ottenere un riferimento, poparlo con NESSUNA animazione e quindi inviarlo un messaggio che riporta il conteggio dei ritiri (questo sarebbe un nuovo metodo che si scrive). Questo nuovo metodo potrebbe anche registrare altre cose, ad esempio se ha timer in corso, NSURLConnections, ecc.

+0

'[NSTimer scheduledTimerWithTimeInterval: 12 target: self selector: @selector (sendTest) userInfo: nil ripete: NO];' questo mantiene il viewController? e in caso affermativo, la funzione 'invalidate' risolverebbe questo? – Operative

+1

@Khawar Ali, per favore non raccomandare che le persone usino '-retainCount': http://whentouseretaincount.com. –

+1

@ Sì positivo, invalidando il timer verrà rilasciato il suo obiettivo. Dalla documentazione per quel metodo del timer: 'Il timer mantiene un forte riferimento al bersaglio fino a quando esso (il timer) non viene invalidato. –

1

Prima di tutto, eliminare [super dealloc]. So che è intuitivo, ma la documentazione dice che non lo fanno.

Nel mio caso, ho avuto un timer osservatore & nel mio metodo dealloc, ma questo non funzionava dal momento che il timer aveva un forte puntatore al controller.

Creato un metodo di pulizia dedicato che ha rimosso l'osservatore & annullato il timer. Una volta eseguito, il controller è stato correttamente deallocato.

Problemi correlati