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

问题描述:

我的应用程序有一个标签栏控制器,其中一个标签项是一个分离视图控制器。它是主视图控制器(即在索引0处)是一个从nib加载的导航控制器,由于它是自定义导航栏。为什么我的视图在低内存警告中消失?

如果这听起来有点模糊,那么它的组合如下:1)无法将SVC添加到IB的TBC中; 2)iOS 4.2 splitview-navbar-colorTint错误。事实上,自从昨天实施解决方案以来,我一直在遇到低内存警告的问题。

解决方法之前我用2个导航控制器初始化SVC并以编程方式将其添加到TBC(由于IB对th标签栏的限制)并且没有问题 - 除了那个苹果错误。

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

但在my adaption of the workaround demo它开始全部变成梨形。发出低存储器警告,同时显示分割视图,整个左侧(主视图)消失。设备上的行为完全相同,实际上我最初在那里发现它。

我很困惑发生了什么事。显示的视图(nav cont的根视图)由表视图子类控制。我重写了didReceiveMemoryWarning,但这并没有帮助。此外(相应地!),超级观点不是零。这是一个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; 
} 

有人有我的想法吗? :)

这让我疯狂!

+0

请尝试重新格式化您的代码。 – Joe 2011-01-20 18:59:12

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

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

哦,伙计。我被an answer to this question('指定'答案!)带入歧途。我现在刚刚注意到,这个更简单的方法也作为答案给出,实际上是最流行的方法。完全忽略它! ^^

没有看到所有的代码,我猜在mem警告期间,非活动视图被破坏。 (代码中说'didReceiveMemoryWarning',你可能有[超级didReceiveMemoryWarning])

你需要确保在你的loadView方法中,需要添加的任何子视图都被重新添加到视图中,并且相应地放下。希望有所帮助。

或者,如果您处于急于或懒惰状态,只是防止所有常见事情发生。这可能很糟糕,可能会导致崩溃,但如果您不耐烦,这是一种替代方法。

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

正如我写道:“我重写了didReceiveMemoryWarning,但这并没有帮助。此外(相应地!),超级视图不是零,它是一个UITableView,正确如此。我没有明确地说,但是,我确实删除了味精超级。 – Rich 2011-01-20 19:11:12

+0

loadView看起来像什么?你可以尝试从数据源/代理重新加载UITableView吗?像[self.tableView reloadData]? – 2011-01-20 19:24:37