为什么我的视图在低内存警告时消失了?

时间:2011-01-20 18:55:04

标签: memory memory-management ios4 uitabbarcontroller uisplitviewcontroller

我的应用程序有一个标签栏控制器,其中一个标签项是一个拆分视图控制器。它的主视图控制器(即索引0)是一个从笔尖加载的导航控制器,因为它是自定义导航栏。

如果这听起来有点模糊,那么它可以归结为1)无法在IB中向TBC添加SVC以及2)iOS 4.2 splitview-navbar-colorTint错误。实际上,只有在昨天实施解决方法之后,我才遇到内存不足警告的问题。

在解决方法之前,我在SVC中安装了2个导航控制器,并以编程方式将其添加到TBC(由于IB对标签栏的限制),没有和问题 - 除了苹果bug之外。

即使在内存不足警告之后,小workaround demo也能正常工作。但它不涉及标签栏的额外开销。

但在my adaption of the workaround demo中,它开始变得梨形。在显示拆分视图时发送低内存警告,整个左侧(主视图)消失。设备上的行为相同,事实上我首先在那里发现了它。

我很困惑发生了什么事。显示视图(nav cont的根视图)由表视图子类控制。我已经覆盖了didReceiveMemoryWarning,但这没有用。此外(相应地!),superview不是零。这是一个UITableView。完全正确。

所以,我认为导航控制器正在发布?但是哪里?为什么不在原始演示?现在的区别是添加了标签栏控制器。这是我的代码,它将它添加到标签栏:

- (void) addTabItemSplitViewWithNavConRoot:(BOOL)hasRootNC {

    // init master/detail views 
    SV1RootViewController *rvc = [[SV1RootViewController alloc] initWithNibName:@"SVC1RootView" bundle:nil];
    SV1DetailViewController *dvc = [[SV1DetailViewController alloc] initWithNibName:@"SVC1DetailView" bundle:nil];

    rvc.detailViewController = dvc;

    UINavigationController *nc = nil;
    if (hasRootNC) {
        nc = [self.pSVC1.viewControllers objectAtIndex:0];
        nc.viewControllers = [NSArray arrayWithObjects:rvc, nil];
        nc.navigationBar.tintColor = [UIColor redColor];
    } else {
        nc = nil;
    }

    UIViewController *vc = (hasRootNC)? (UIViewController*)nc :rvc;

    UISplitViewController *svc = [self newSplitViewControllerWithMasterVC:vc detailVC:dvc];
    svc.delegate = dvc;

    // init the tab bar item
    svc.tabBarItem = [[UITabBarItem alloc] initWithTitle:(hasRootNC)? @"SplitView with Nav Root":@"Simple SplitView"
                                                   image:nil 
                                                     tag:0];    
    // int the split view
    NSMutableArray *controllersArray = [NSMutableArray arrayWithArray:self.pTabBarController.viewControllers];
    [controllersArray addObject:svc];
    [self.pTabBarController setViewControllers:controllersArray];

    // cleanup
    [nc release];
    [rvc release];
    [dvc release];
    [svc release];
}

- (UISplitViewController*) newSplitViewControllerWithMasterVC:(UIViewController*)masterView
                                                     detailVC:(UIViewController*)detailView {

    UISplitViewController *svc = [[UISplitViewController alloc] init];
    NSMutableArray *controllersArray = [NSMutableArray arrayWithObjects:masterView, detailView, nil];
    [svc setViewControllers:controllersArray];

    return svc;
}

有人对我有想法吗? :)

这让我疯了!!!

2 个答案:

答案 0 :(得分:1)

解决了它。曾经用编程初始化分割视图控制器的那种奇怪的混合,但是从主窗口xib读取导航控制器(所有这些都是因为Apple bug需要的自定义工具栏)。但我的猜测是,xib的导航控制器正在卸载它的视图。

所以现在我只是从笔尖拿出整个SVC,而不是手工构建它。实际上更整洁,更简单。

哦,伙计。我被an answer to this question误导了('指定'答案!)。我现在只是注意到这个更简单的方法也作为答案给出,实际上是最受欢迎的。完全忽略了它! ^^

答案 1 :(得分:0)

在没有看到所有代码的情况下,我猜测在mem警告期间非活动视图被破坏了。 (代表'didReceiveMemoryWarning'的代码,你可能有[super didReceiveMemoryWarning])

您需要确保在loadView方法中,任何需要添加的子视图都会重新添加到视图中,并相应地进行布局。希望有所帮助。

或者,如果你匆忙或懒惰,只要防止所有常见的事情发生。这可能很糟糕并且可能导致崩溃,但如果您不耐烦,这是另一种方法。

- (void)didReceiveMemoryWarning {
     //do nothing
    //[super didReceiveMemoryWarning];
}