Memory 为什么我的观点在低内存警告上消失了?
我的应用程序有一个选项卡栏控制器,其中一个选项卡项是拆分视图控制器。它的主视图控制器(即索引0处)是从nib加载的导航控制器,因为它是自定义导航栏 如果这听起来有点晦涩难懂,那么这是因为1)无法在IB中的TBC中添加SVC和2)iOS 4.2缺陷的组合。事实上,直到昨天实施了解决方案之后,我才遇到内存不足警告的问题 在解决方法之前,我使用2个导航控制器启动SVC,并将其添加到TBC中,所有这些都是通过编程方式(由于IB对th选项卡栏的限制),并且没有和问题——好吧,除了苹果的错误 即使在内存不足警告之后,little也可以正常工作。但它不涉及选项卡栏的额外开销 但它开始变成梨形。显示分割视图时发送内存不足警告,整个左侧(主视图)消失。事实上,我是在那个里第一次发现它的 我不知道发生了什么事。显示视图(导航控制的根视图)由表视图子类控制。我已经克服了以往的记忆警告,但那没有帮助。此外(相应地!),superview不是零。这是一个很好的视角。完全正确 我想导航控制器要被释放了?但是在哪里呢?为什么不在最初的演示中呢?现在的区别是添加了我的选项卡栏控制器。以下是我将其添加到选项卡栏的代码: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选项卡栏的限制),并且没有和问题——好吧,除了苹果的错误 即使在内存不足
- (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组织事情时,事情就开始正常运转了。