UIView控制器神秘地被解除分配

时间:2010-05-17 18:37:39

标签: iphone objective-c uinavigationcontroller

我有一个带有“欢迎”页面,中间页面和详细页面的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,但这没有帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

您使用的是removeFromSuperview吗?请注意它的发布以及从superview中移除......

答案 1 :(得分:0)

我找到了。在我的搜索视图控制器上,我在前一个视图上传递了对UITableView的引用,所以我可以在过滤源数据后调用它上面的refreshData。

我将它设置为属性(非原子,赋值),这似乎是正确的,但是在dealloc时间,我继续前进并说[theTableView release]。这实际上是我第二次出现神秘且长期存在的错误,因为我过度释放了一些东西。我打算这次学习。