Memory 为什么我的观点在低内存警告上消失了?

Memory 为什么我的观点在低内存警告上消失了?,memory,memory-management,ios4,uitabbarcontroller,uisplitviewcontroller,Memory,Memory Management,Ios4,Uitabbarcontroller,Uisplitviewcontroller,我的应用程序有一个选项卡栏控制器,其中一个选项卡项是拆分视图控制器。它的主视图控制器(即索引0处)是从nib加载的导航控制器,因为它是自定义导航栏 如果这听起来有点晦涩难懂,那么这是因为1)无法在IB中的TBC中添加SVC和2)iOS 4.2缺陷的组合。事实上,直到昨天实施了解决方案之后,我才遇到内存不足警告的问题 在解决方法之前,我使用2个导航控制器启动SVC,并将其添加到TBC中,所有这些都是通过编程方式(由于IB对th选项卡栏的限制),并且没有和问题——好吧,除了苹果的错误 即使在内存不足

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

如果这听起来有点晦涩难懂,那么这是因为1)无法在IB中的TBC中添加SVC和2)iOS 4.2缺陷的组合。事实上,直到昨天实施了解决方案之后,我才遇到内存不足警告的问题

在解决方法之前,我使用2个导航控制器启动SVC,并将其添加到TBC中,所有这些都是通过编程方式(由于IB对th选项卡栏的限制),并且没有和问题——好吧,除了苹果的错误

即使在内存不足警告之后,little也可以正常工作。但它不涉及选项卡栏的额外开销

但它开始变成梨形。显示分割视图时发送内存不足警告,整个左侧(主视图)消失。事实上,我是在那个里第一次发现它的

我不知道发生了什么事。显示视图(导航控制的根视图)由表视图子类控制。我已经克服了以往的记忆警告,但那没有帮助。此外(相应地!),superview不是零。这是一个很好的视角。完全正确

我想导航控制器要被释放了?但是在哪里呢?为什么不在最初的演示中呢?现在的区别是添加了我的选项卡栏控制器。以下是我将其添加到选项卡栏的代码:

- (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;
}
有人对我有什么想法吗?:)


它快把我逼疯了

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

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

或者,如果你很忙或者很懒,就阻止所有平常的事情发生。这可能很糟糕,可能会导致崩溃,但如果您不耐烦,这是另一种方法

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

解决了。这与以编程方式初始化分割视图控制器的wierd混合有关,但注入了从主窗口xib读取的导航控制器(这一切都是因为Apple bug需要自定义工具栏)。但我猜是来自xib的导航控制器卸载了它的视图

所以现在我只是从nib获取整个SVC,而不是手工构建它。实际上,更整洁、更简单


哦,老兄。我被(指定的)答案误导了。我现在刚刚注意到,这个简单得多的方法也是作为答案给出的,实际上是最流行的。完全忽略了它!^^

请尝试重新格式化您的代码。正如我所写的“我已经重写了didReceiveMemoryWarning,但这没有帮助。而且(相应地!),superview不是零。它是一个UITableView。正确地说。”我没有明确地说,但是的,我确实将消息删除到了super。loadView看起来像什么?您可以尝试从datasource/delegate重新加载UITableView吗?类似于[self.tableView重载数据]?嗯。。该视图从属于(SV1RootViewController*)rvc的nib SVC1RootView加载。反过来,rvc被写入(UINavigationController*)nc.viewControllers,它用于初始化分割视图控制器,分配给一个tabBarItem,添加到MainWindow.xib的选项卡栏控制器,其视图在调用上述方法后立即添加到窗口。所以我没有直接连接到loadView。还是我?!?我模糊的想法是,来自MainWindow.xib的导航控制器正在发布?UITableView是它自己的数据源/委托,所以我在哪里调用重载数据?你收到了记忆警告吗?谢谢!同样的问题让我发疯。当我用IB组织事情时,事情就开始正常运转了。