2012-04-12 28 views
1

Ich habe einen View-Controller, in dem es zwei Möglichkeiten gibt, zurückzugehen.Dealloc wird nicht aufgerufen

Erstes Szenario so geht:

RecordVC -> Tells Delegate zu dismissRecordVC: ->RecordVC entlassen und ausgeplant

Zweites Szenario so geht:

RecordVC -> sagt Delegate zu dismissAndShowVideosForRecordVC: ->RecordVC entlassen und VideosTVC präsentiert ABERRecordVC ist NICHT freigegeben.

Erstes Szenario wird wie folgt ausgelöst:

- (IBAction)back:(id)sender { 
    if ([_chromaKeySessionManager isWriting]) { 
     [_chromaKeySessionManager cancelWriting]; 
    } 
    [_chromaKeySessionManager stopRunning]; 
    [delegate dismissRecordVC:self]; 
} 

die Delegatmethode dismissRecordVC: dies:

- (void)dismissRecordVC:(RecordVC *)vc { 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Wenn diese back: Methode verwendet wird, dann wird RecordVC ausgeplant just fine.

Zweites Szenario wird wie folgt ausgelöst:

- (IBAction)goToVideos { 
    if ([_chromaKeySessionManager isWriting]) { 
     [_chromaKeySessionManager cancelWriting]; 
    } 
    [_chromaKeySessionManager stopRunning]; 
    [delegate dismissAndShowVideosForRecordVC:self]; 
} 

und dismissAndShowVideosForRecordVC: der Delegatmethode:

- (void)dismissAndShowVideosForRecordVC:(RecordVC *)vc { 
    [self dismissViewControllerAnimated:YES completion:^{ 
     VideosTVC *vc = [[VideosTVC alloc] init]; 
     [[self navigationController] pushViewController:vc animated:YES]; 
     [vc release];  
    }]; 
} 

Also, in diesem Fall RecordVC nie freigegeben wird. Der einzige Unterschied hier ist, dass ich es mit einem Completion Block ablehne und einen anderen Controller dränge.

Für mich, in beiden Szenarien sehen genau die gleichen (so weit wie beibehalten/Freigabe geht), außer in der ersten es RecordVC bekommen freigegeben und in letzterem Szenario wird es nie freigegeben. Seltsam, und ich weiß, ich sollte das nicht sagen, aber scheint wie ein internes Leck zu sein.

Gibt es etwas, das ich behalte, das mir nicht bekannt ist, wenn ich den Abschlussblock für die Ablehnung verwende? Danke

+0

disneyViewControllerAnimated ist die Methode von UIViewController. Schau es dir hier an: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html – 0xSina

+0

In diesem Fall wird irgendwo in deinem Code eine Referenz von VideoTVC gespeichert (behalten?). –

+0

Muss ich wirklich überprüfen?Es gibt zwei Szenarien, in einem wird es gut verteilt, in anderen, wie Sie direkt sehen können, gibt es keinen großen Unterschied und keine Referenzen werden beibehalten, aber es wird nie magisch freigegeben. Aber ich werde noch einmal überprüfen, um sicherzustellen, – 0xSina

Antwort

0

Ein Unterschied ist, dass der Abschlussblock self verweist. Das bewirkt, dass es mindestens so lange gehalten wird, bis der Block ausgelöst wird. Zugegeben, danach sollte es veröffentlicht werden.

Versuchen Sie, eine lokale außerhalb des Blocks zu erstellen, um [self navigationController] zu halten, und verwenden Sie dann das lokale in dem Block, so gibt es keinen Verweis auf self.

Ich werde auch darauf hinweisen, dass in -dismissAndShowVideosForRecordVC: Sie einen Parameter und eine lokale mit dem gleichen Namen haben. Sollte nicht wichtig sein, aber vielleicht gibt es einen Compiler Bug.

+1

Ich dachte darüber nach, stoppte mich jedoch, als ich erkannte, dass das Selbst nicht das Ding ist, das beibehalten wird, es ist der präsentierte View-Controller. – borrrden

+0

Ah, guter Punkt. Ich habe den Überblick verloren. ;) –

+0

Danke für die Eingabe. Guter Aufruf, habe den gleichen Variablennamen nicht gesehen, also geändert (aber immer noch kein Unterschied). Erstellt einen lokalen außerhalb von Block für navController, kein Unterschied .. :( – 0xSina