2011-04-28 47 views
1

我正在使用我的应用程序委托在视图控制器之间转换。当委托人决定不再需要视图控制器时,根据来自服务器的消息,它需要删除当前视图并将其替换为另一个视图。目前,我的代码如下所示:如何删除不再需要的视图控制器?

- (void) showFight: (NSNotification*) notification 
    { 
     if(self.window.rootViewController != self.fightViewController) 
     { 
      NSDictionary* dict = [notification userInfo]; 

       FightViewController *fightView = [[FightViewController alloc] 
                initWithNibName:@"FightViewController" bundle:nil]; 
       fightView.userId = _userId; 

       self.fightViewController = fightView; 
       [fightView release]; 
       [self.radarViewController.view removeFromSuperview]; // Doesn't work. 

       self.window.rootViewController = self.fightViewController; 
       [self.fightViewController showMonster:dict]; 

     } 
    } 

我知道我的视图控制器没有被删除,因为我可以听到它在后台的声音效果。

我想彻底销毁视图控制器,因为我只想随时在内存中使用一个视图控制器。我打算每次从头开始创建视图控制器,如上面的代码所示。我做得不对吗?

+0

self.myViewController = nil破坏内存中的VC,除非没有其他保留的引用 – Felix 2011-04-28 14:00:30

回答

2

这里的问题似乎是你不释放视图控制器。想想究竟是什么在你的代码的情况:

[self.radarViewController.view removeFromSuperview]; 

你从它的超视图中删除视图。视图控制器仍然存在,它所做的是控制视图上应显示的内容,并在您的情况下显然播放声音。

放入一个简单的方法:视图控制器是一个对象。它有一个孩子,这个看法。那是另一个对象。您从另一个视图中删除视图,但控制已删除视图的对象仍然存在(实际上,视图对象也是如此)。

如果你想杀死整个视图控制器,从它的父删除视图之后调用此:

[self.radarViewController release];

或者,如果视图是一个保留属性(我假设通过看你的代码),你也可以使用:

self.radarViewContoller = nil;

自动为您所合成的二传手释放。

当视图控制器被释放时,其引用计数减1。如果引用计数达到零,那么控制器将被解除分配。

0

到目前为止,我的理解是您的问题是在服务器上添加新的ViewController通知,并用新的查看更改当前视图。首先,您必须添加视图控制器,就像下面一样,因为引用无助于更新视图。

[self.window.rootViewController.view addSubview: self.fightViewController.view] 

在我看来,你需要标记您的控制器,并补充说,如果它已经存储在内存控制器前检查,否则,对象池就会漏水。对内存泄漏说“不”!

- (void) showFight: (NSNotification*) notification 
{ 
     UIView *fightView = (UIView *)[self.window.rootViewController.view viewWithTag: FIGHT_VIEW_TAG]; 
     if (self.window.rootViewController.view.tag != fightView.tag) { 

      NSDictionary* dict = [notification userInfo]; 
      FightViewController *fightView = [[FightViewController alloc] 
               initWithNibName:@"FightViewController" bundle:[NSBundle mainBundle]]; 

      //Remove the current view. 
      [self.window.rootViewController.view removeFromSuperview]; // If you're adding the fighting View in the root View, then why are you trying to remove current view through radar controller which has already added in the window (root view). 

      fightView.userId = _userId; 
      [fightView setTag: FIGHT_VIEW_TAG]; 
      [self.window.rootViewController.view addSubView: self.fightViewController.view]; 

      [self.fightViewController showMonster:dict]; 
      [fightView release]; 
    } 
} 

您不需要将它们视为全局的,直到您的要求不同。

+0

标记我的视图控制器? – 2011-04-28 14:20:58

+0

是标记你的控制器w.r.t特定的键。例如: UIView * middleView =(UIView *)[self。viewviewWithTag:MIDDLEVIEW_TAG]; if(middleView!= nil){middleView removeFromSuperview]; } sectionViewController.view.frame = CGRectMake(0,10,320,480); [sectionViewController.view setTag:MIDDLEVIEW_TAG]; [self.view addSubview:sectionViewController.view]; – Deminem 2011-04-28 14:25:47

+0

对不起,乱码看,但为什么不是代码缩进不起作用的评论? – Deminem 2011-04-28 14:31:21

相关问题