2012-04-11 2 views
2

Sehen Sie sich meinen Code unten, bekomme ich Speicherfehler, nachdem ich auf "Zurück" -Button klicken, wird das Problem behoben, wenn ich löschte [aboutView release] Warum ist das? und wie sollte ich aboutView veröffentlichen?UIViewController Animation Speicherfreigabe

-(IBAction)swichView { 
    AboutView *aboutView = [[AboutView alloc] init]; 
    [aboutView.view setAlpha:0]; 
    [self.view addSubview:aboutView.view]; 
    [UIView beginAnimations:@"" context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [aboutView.view setAlpha:1]; 
    [UIView commitAnimations]; 
    [aboutView release]; 
} 

zweiten View Contorller:

-(IBAction)back { 
    [UIView beginAnimations:@"" context:nil]; 
    [UIView setAnimationDuration:1.0]; 
    [self.view setAlpha:0]; 
    [UIView commitAnimations]; 
    [self.view removeFromSuperview]; 
} 
+0

Gibt es einen Grund, warum Sie 'aboutView.view' anstatt' aboutView' selbst hinzufügen? Der Grund für den Absturz ist, dass 'aboutView' nicht beibehalten wird. –

Antwort

0

In Ihrem switchView, sollten Sie keine Instanz AboutView erschaffen. AboutView *aboutView sollte als Instanzvariable erstellt werden, nicht als lokale Funktion.

Aufgrund des Designs der View-Controller-Animation, die Animation selbst NICHT behalten Sie Ihren Controller und automatische Freigabe, wenn die Animation endet. Ihr Code hebt den View-Controller während der Animation auf, weshalb er abstürzen wird.

Um eine ordnungsgemäße Freigabe eine Ansicht nach einer Animation, versuchen:

-(IBAction)switchView { 
    // given that aboutView is an instance variable 
    aboutView = [[AboutView alloc] init]; 
    [aboutView.view setAlpha:0]; 
    [self.view addSubview:aboutView.view]; 
    [UIView animationWithDuration:1.0 animations:^{ 
     [aboutView.view setAlpha:1]; 
    } completion:^(BOOL fin) { 
     // don't release it 
    }]; 
} 

-(IBAction)back { 
    [UIView animationWithDuration:1.0 animations:^{ 
     [aboutView.view setAlpha:0]; 
    } completion:^(BOOL fin) { 
     [aboutView.view removeFromSuperview]; 
     [aboutView release]; 
    }]; 
} 
+0

viewDidAppear wird nicht aufgerufen, nachdem aboutView von Superview entfernt wurde. – Houranis

+0

@Houranis Hallo, Ich habe meinen Beitrag bearbeitet, um die richtige Art der Verwaltung der Ansichtsanimation ohne den Controller zu reflektieren (da Sie gesagt haben, dass der Controller-Delegat nicht aufgerufen wird). –

0

Das Problem ist wahrscheinlich [self.view removeFromSuperview]; in -(IBAction)back;

Sie nicht, dass müssen. In einem UIViewController wird seine Ansicht für Sie behandelt, solange Sie es in dealloc freigeben.

AboutView wird durch die Ansicht der Steuerung beibehalten werden, wenn Sie addSubview:

Diese Methode Ansicht behält und setzt seine nächste Responder an den Empfänger, der seine neue Superview ist. - Docs für addSubview:

Also, wenn die Sicht wird freigegeben, so wird aboutView.

+0

Also wie kann ich self.view in Second View schließen, ohne [self.view removeFromSuperview] zu verwenden. – Houranis

+0

Wahrscheinlich möchten Sie tun, ist all diese Controller in einem UINavigationController Stapel und einfach Pop-off. Wenn Sie etwas auf diesem Controller ausführen, der Animationen benötigt, sollten Sie dies als Unteransicht zu self.view hinzufügen und stattdessen die Unteransicht animieren. – Allyn

0

Nichts scheint nach der Methode Halte aboutView Objekt zu '- (IBAction) swichView'

die Zeile '[self.view addSubview: aboutView.view];'

einen zusätzlichen Verweiszähler zu aboutView.view, aber nicht aboutView geben selbst.

Ich würde wahrscheinlich das Delegatenmodell ähnlich wie UIPopoverViewController arbeiten.

definieren protocal mit Verfahren nach dem Vorbild der

-(void) subViewClosed:(AboutView*)aboutView; 

Machen die Eltern sie umzusetzen, dann gehen:

Eltern

-(IBAction)swichView { 
    .. existing stuff .. 

    (dont release) 

    aboutView.delegate = self; 
} 

AboutView Klasse

-(IBAction)back { 
    ... existing stuff ... 

    [self.delegate subViewClosed:self]; 
} 

Parent

-(void) subViewClosed:(AboutView*)aboutView{ 
    [aboutView release]; 
} 
+0

Ich kann nicht von AboutView ViewController SubViewClosed aufrufen, da es in Parent ViewController definiert ist, self.delete nicht gültige Zeile. – Houranis