2014-04-30 13 views
5

In iOS, ich Pop von aktuellen ViewController in vorherige, aber es geht nicht in Dealloc gehen.iOS - ViewController Dealloc-Methode nicht aufgerufen, nachdem vorherige AnsichtController

Liegt das daran, dass ein anderer Zeiger auf den aktuellen viewController zeigt, entweder in einem anderen viewController oder in dem aktuellen? Diese

ist, wo ich zur vorherigen Ansicht Pop:

- (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]; 
    } 
} 

Das ist meine dealloc Funktion:

- (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

Bitte geben Sie einen Code zum besseren Verständnis Ihrer Frage. –

Antwort

6

überprüfen, um sicherzustellen, dass ARC ist in Ihrem Projekt freigegeben. Wenn ARC nicht aktiviert ist, sollte dealloc aufgerufen werden, es sei denn, Ihr Code enthält Ihren View-Controller. Sie sollten durch die Instruments tool überprüfen, wenn Ihre Pop-Befehle Speicher reduziert oder nicht.

Es kann einige andere Gründe geben, die in einer anderen Antwort erwähnt werden, die ich unten schreibe: Der offensichtliche Grund ist, dass etwas Ihren viewController behält. Sie müssen sich Ihren Code genau ansehen. Machen Sie in Ihrer Klasse etwas, das Delegaten verwendet, da sie manchmal den Delegaten behalten. NSURLConnection behält Ihre Klasse und NSTimer ebenfalls. Sie können Code in Ihrer Klasse zerstreuen und die Anzahl der gespeicherten Klassen protokollieren und versuchen, herauszufinden, wo. In dem Code, den Sie bisher gezeigt haben, sollte der Retain nur 1 sein, da die Klasse nur vom Navigationscontroller beibehalten wird.

Bevor Sie Ihre Ansicht öffnen, erhalten Sie eine Referenz darauf, fügen Sie sie mit NO-Animation ein und senden Sie ihr eine Nachricht, die die Retain-Zählung meldet (dies wäre eine neue Methode, die Sie schreiben). Diese neue Methode könnte auch andere Dinge protokollieren, z. B. ob es irgendwelche Timer hat, NSURLConnections, usw.

+0

'[NSTimer terminatedTimerWithTimeInterval: 12 Ziel: self-Selektor: @selector (sendTest) userInfo: keine Wiederholungen: NEIN];' Würde dies den viewController behalten? und wenn ja, würde die "invalidate" Funktion das beheben? – Operative

+1

@Khawar Ali empfehlen Sie nicht, dass die Leute '-retainCount' verwenden: http://www.wentouseretaincount.com. –

+1

@Operativ Ja, wenn der Timer ungültig wird, wird sein Ziel freigegeben. Aus der Dokumentation für diese Timer-Methode: 'Der Timer behält eine starke Referenz auf das Ziel bei, bis es (der Timer) ungültig wird.' –

1

Zunächst einmal loswerden [super dealloc]. Ich weiß, das ist intuitiv, aber die Dokumentation sagt, mach es nicht.

In meinem Fall hatte ich einen Beobachter & Timer in meiner Dealloc-Methode, aber das würde nicht ausgeführt, da der Timer einen starken Zeiger auf den Controller hatte.

Erstellt eine dedizierte Aufräummethode, die den Beobachter & löschte den Timer ungültig gemacht. Sobald das ausgeführt wurde, wurde der Controller korrekt freigegeben.