代码之家  ›  专栏  ›  技术社区  ›  mr-sk

视图控制器问题-以前的控制器(图像/内容)仍然存在(其未*消失*/dealloc'd/released)

  •  0
  • mr-sk  · 技术社区  · 15 年前

    所以,

    我通常从nib初始化控制器并将其弹出到视图堆栈开始。但问题是,第一个控制器并没有真正消失——它仍然存在。

    所以,我们开始走这条路:

    启动appdelegate并加载rootviewcontroller:

    mRootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    [(m42Window *)[application.windows objectAtIndex:0] setController:mRootController];
    

    从rootviewcontroller转到regionviewcontroller:

    RegionViewController *controller = [[RegionViewController alloc] initWithNibName:@"RegionViewController" bundle:nil];
    [[self getWindow] setController:controller];
    [controller release];
    

    方法是:

    - (void) setController:(m42ViewController *)controller
    {   
        if (mController != nil)
        {       
            for (UIView *view in mController.view.subviews)
            {
                if (view != nil) 
                {
                    [view removeFromSuperview];
                }
            }       
            [mController.view removeFromSuperview];
            [mController release];
            mController = nil;
        }
    
        mController = controller;
        [mController retain];
        [self insertSubview:mController.view atIndex:1];
    }
    

    本期图片: rootview控制器: http://mr-sk.com/img/rootViewController.png regionviewcontroller(从rootviewcontroller可见的图像): http://mr-sk.com/img/regionViewController.png

    现在的问题是rootviewcontroller中的图像是可见的(我有一个空的uiimageview,它显示控制器上的图像 在下面 它)在regionviewcontroller中-不管是什么原因,视图实际上并没有从超级视图中移除并释放。出于许多原因,我们希望这些观点消失:

    1. 记忆脚印-为什么要保留我们不需要的各种资产。如果用户返回,我们可以重新创建它们
    2. 如果代码在其他控制器中运行呢?好吧,在这种情况下我们不想这样。我们要他们走。

    那么,怎么了?从根本上说,我们一定是错过了iphone 101课程。呵呵。 我看到了,因为这是我和另一个人。

    谢谢。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Ben Gottlieb    15 年前

    此代码有许多问题:

    • 你真的应该在这里使用uinavigationcontroller。如果不是全部,你的大部分问题都会消失。
    • 您似乎过度保留了传递给-setcontroller的控制器。您在第二个代码示例中正确地释放了alloc'd控制器(因为-setcontroller保留了它),但在第一个示例中没有。
    • 您正在删除子视图,然后删除其父视图。没有理由这样做(这可能会导致其他问题)。
    • 您没有检查mcontroller和传递给-setcontroller的参数实际上是不同的参数。如果是的话,你可能会崩溃。
    • 看起来你在使用一组窗口?为什么?
    • 尚不清楚object-setcontrol:是什么成员。窗户?风景?
    • 一旦你解决了所有这些问题,你的问题可能就消失了(当然,它可能不是你放在这里的代码)。