我有一个带有“欢迎”页面,中间页面和详细页面的UINavigation计划。
在中间页面,有一个分段控制器,可以在表,日历和MKMapView之间交换该页面的主体,每个都使用自己的视图控制器类实现。
今天我实现了MapView及其注释以及所有这些。这真好。每个标注上的详细信息都会将您带到详细页面,就像通过表格到达那里一样。可爱。
我还有一个右键按钮按钮,可以进入“搜索”视图。从那里你可以搜索我正在导航的数据。当它完成对数据的过滤(我保留在数据单例中的对象数组)时,它会使表重新加载其数据,并在地图视图上调用我的注释 - 清除 - 构建器方法,然后自行弹出,所以“中间”页面(包括其中的任何视图)都会回到屏幕上。
问题是,如果我在地图和搜索之间往返几次,任何提及表格视图都会导致我们崩溃:*** -[CALayer retain]: message sent to deallocated instance 0x710b810
。 (我显然已经开启了NSZombies。)
我在表视图控制器的dealloc方法中放了一个NSLog。那东西永远不会被召唤。我不知道我们是否为了记忆目的而在幕后抛弃它,或者如果我泄漏它并且不能让我的手回到它上面,或者是什么。我有点不知道在哪里看。任何提示?
编辑:
这是代码,我在控制器中交换了我的“中间”viewController的主视图:
- (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) {
if (!self.tableController)
self.tableController = [[EventsTableViewController alloc]
initWithNibName:@"EventsTableView" bundle:nil];
[mainView addSubview:self.tableController.view];
}
if (choice == 1) {
if (!self.calendarController)
self.calendarController = [[EventsCalendarViewController alloc]
initWithNibName:@"EventsCalendarView" bundle:nil];
[mainView addSubview:self.calendarController.view];
}
if (choice == 2) {
if (!self.mapController)
self.mapController = [[EventsMapViewController alloc]
initWithNibName:@"EventsMapView" bundle:nil];
[mainView addSubview:self.mapController.view];
}
}
下面的Per Adam,我在那里removeFromSuperview
。我尝试在删除它之前坚持使用oldView,但这没有帮助。
谢谢!
答案 0 :(得分:0)
您使用的是removeFromSuperview吗?请注意它的发布以及从superview中移除......
答案 1 :(得分:0)
我找到了。在我的搜索视图控制器上,我在前一个视图上传递了对UITableView的引用,所以我可以在过滤源数据后调用它上面的refreshData。
我将它设置为属性(非原子,赋值),这似乎是正确的,但是在dealloc时间,我继续前进并说[theTableView release]。这实际上是我第二次出现神秘且长期存在的错误,因为我过度释放了一些东西。我打算这次学习。