【发布时间】:2011-02-18 15:55:31
【问题描述】:
- (void)launchSearch
{
EventsSearchViewController *searchController = [[EventsSearchViewController alloc] initWithNibName:@"EventsSearchView" bundle:nil];
[self.navigationController pushViewController:searchController animated:YES];
//[searchController release];
}
注意[searchController release] 已被注释掉。我知道将searchController 推送到导航控制器会保留它,我应该从我的代码中释放它。毕竟我只是分配/初始化它,如果我不释放它,它会泄漏。
注释掉该行后,导航效果很好。如果它没有被注释掉,我可以导航到这个视图中,但是返回一个级别会崩溃并出现 *** -[CFArray release]: message sent to deallocated instance 0x443a9e0 错误。
这里发生了什么?当它消失时,NavigationController 是否会以某种方式为我释放它?
XCode 中 UINavigationController 模板上的样板已发布新推送的控制器。但是当我这样做时,它会失败。
---编辑----
所以今天早上,我坐下来,它起作用了。没有真正的线索为什么。叹息。
然后,将我认为我学到的知识应用到同一控制器的另一块上,我做了以下操作。昨天我有这段代码,没有发布声明,因为它不能正常工作。所以今天早上我添加了它们来创建:
- (IBAction)switchView:(id)sender
{
UISegmentedControl *seg = (UISegmentedControl *)sender;
NSInteger choice = [seg selectedSegmentIndex];
NSArray *array = [mainView subviews];
UIView *oldView = [array objectAtIndex:0];
[oldView removeFromSuperview];
if (choice == 0) {
tableController = [[EventsTableViewController alloc]
initWithNibName:@"EventsTableView" bundle:nil];
[mainView addSubview:tableController.view];
[tableController release];
}
if (choice == 1) {
calendarController = [[EventsCalendarViewController alloc]
initWithNibName:@"EventsCalendarView" bundle:nil];
[mainView addSubview:calendarController.view];
[calendarController release];
}
if (choice == 2) {
mapController = [[EventsMapViewController alloc]
initWithNibName:@"EventsMapView" bundle:nil];
[mainView addSubview:mapController.view];
[mapController release];
}
}
这样设置后,当我进入视图时,我的视图的主入口充满了 EventsTableViewController 的视图,我可以单击 mapView 和 calendarView,但是当我返回 tableView 时,我死了,因为正在释放的实例上调用表委托方法。
所以我把所有这些控制器都合成了属性,所以我可以在[dealloc] 中发布它们。这似乎可行,但真正的问题是为什么将这些视图添加为子视图并不能保留它们,将所有权传递给它所属的新视图,允许我在那里释放它们?
【问题讨论】:
-
如果注释掉 pushViewController 行但取消注释 release 行会怎样?发布会崩溃吗?
-
不。 UI 中显然没有发生任何事情,但是 NSLog 告诉我它已经到了该方法的末尾。但这并不是说即使按下该版本也会崩溃。当我从刚刚按下的 searchController 备份时,那是我崩溃的时候。
-
好的,这是最糟糕的事情。今天早上它起作用了。我留下了推动和释放,我不能让它崩溃。所以然后我开始寻找其他地方,我正在将控制器推到导航上,在那里我离开了那些释放,因为否则它不起作用,当我将它们添加回来时,发生了一些更奇怪的事情。我会用相关代码更新上面的问题。
标签: iphone memory-management uinavigationcontroller