2010-12-10 12 views
0

Ich habe eine Schaltfläche auf mainViewController, die durch Tippen auf eine andere Ansicht öffnet.UIViewController mit den Objekten

-(void)buttonTap:(id)sender 
{ 
    GameViewController *gameViewController = [[GameViewController alloc] initWithNibName:@"GameViewController" bundle:[NSBundle mainBundle]]; 

    Level *level = [levels objectAtIndex:currentLevelNumber]; 
    gameViewController.level = level; 

    UIView *gameview = gameViewController.view; 
    gameview.frame = CGRectMake(0, 0, 480, 320); 

    CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0); 
    [gameview setTransform:rotate]; 

    gameview.center = CGPointMake(160, 240); 

    [[self.view window] addSubview:gameview]; 
    [gameViewController release]; 
    gameViewController = nil; 
} 

Im SpielViewController habe ich eine andere Taste, um sich zu schließen.

-(IBAction)buttonTap:(id)sender 
{ 
    [self.view removeFromSuperview]; 
    //[self.view release]; 
} 

Ich habe einen Timer in der GameViewController, der auch noch nach dem Schließen der Ansicht ausgelöst wird. Die ViewDidUnload oder Dealloc werden überhaupt nicht ausgelöst. Dadurch wird das Spiel schließlich abgehackt. Wann und wie gibt dieser Gameviewcontroller alle darin enthaltenen Objekte frei? Ich habe überall im Internet gesucht, konnte aber nicht die richtige Antwort finden.

Antwort

0

Wenn Sie die Ansicht eines Ansichtscontrollers hinzufügen, werden bestimmte Lebenszyklusmethoden auf dem Ansichtscontroller nicht aufgerufen. Dazu gehören Dinge wie die folgenden:

  • viewWillAppear:
  • viewDidAppear:
  • viewWillDisappear:
  • viewDidDisappear:
  • viewDidUnload kann oder nicht aufgerufen werden kann. Ich glaube es ist, wenn Sie die Eigenschaft view jemals explizit auf nil setzen.
  • Alle Drehbezogenen Methoden

Stattdessen möchten Sie wahrscheinlich zu present a modal view controller. Dies fügt es formell in eine Hierarchie von View-Controllern ein, hilft bei der Verwaltung Ihres Speichers und ruft bei Bedarf alle oben genannten Methoden auf. Wenn Sie dies auf diese Weise tun, können Sie den Ansichtscontroller sofort nach dem Aufruf von presentModalViewController:animated: freigeben, und es wird bis zu seiner Abweisung herum behalten.

Wenn Sie sich entscheiden, mit Ihrem aktuellen Ansatz zu halten (obwohl ich nicht empfehlen, so zu tun), sollten Sie tun, wahrscheinlich die folgenden wenn gameview vom Bildschirm verschwindet:

gameViewController.view = nil; 
[gameViewController release]; 
gameViewController = nil; 
+0

Irgendwie habe ich nicht E-Mail Benachrichtigung über die Antworten erhalten. Ich habe 16 Stunden verschwendet, weil ich deine Nachricht nicht früher gesehen habe. Es klingt wie der Weg zu gehen, werde ich sofort versuchen. Vielen Dank. – gangt

+0

presentModalViewController Zeug hat nicht geholfen. Um die Sache noch schlimmer zu machen, löschte es den Inhalt meiner Hauptansicht, wenn die Modalansicht geschlossen wurde. Nicht sicher warum. Ich recherchiere immer noch. – gangt

Verwandte Themen