为什么我的视图在低内存警告中消失?
我的应用程序有一个标签栏控制器,其中一个标签项是一个分离视图控制器。它是主视图控制器(即在索引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;
}
有人有我的想法吗? :)
这让我疯狂!
解决了它。对于那种用编程方式初始化分割视图控制器的奇妙组合,却用从主窗口xib中读取的导航控制器注入(所有这些都是因为Apple bug需要自定义工具栏)。但我的猜测是,来自xib的导航控制器正在卸载视图。
所以现在我只需从笔尖取整个SVC,而不是手动构建它。实际上更整洁,更简单。
哦,伙计。我被an answer to this question('指定'答案!)带入歧途。我现在刚刚注意到,这个更简单的方法也作为答案给出,实际上是最流行的方法。完全忽略它! ^^
没有看到所有的代码,我猜在mem警告期间,非活动视图被破坏。 (代码中说'didReceiveMemoryWarning',你可能有[超级didReceiveMemoryWarning])
你需要确保在你的loadView方法中,需要添加的任何子视图都被重新添加到视图中,并且相应地放下。希望有所帮助。
或者,如果您处于急于或懒惰状态,只是防止所有常见事情发生。这可能很糟糕,可能会导致崩溃,但如果您不耐烦,这是一种替代方法。
- (void)didReceiveMemoryWarning {
//do nothing
//[super didReceiveMemoryWarning];
}
正如我写道:“我重写了didReceiveMemoryWarning,但这并没有帮助。此外(相应地!),超级视图不是零,它是一个UITableView,正确如此。我没有明确地说,但是,我确实删除了味精超级。 – Rich 2011-01-20 19:11:12
loadView看起来像什么?你可以尝试从数据源/代理重新加载UITableView吗?像[self.tableView reloadData]? – 2011-01-20 19:24:37
请尝试重新格式化您的代码。 – Joe 2011-01-20 18:59:12