解雇后UIViewController子类未被释放

时间:2015-01-27 19:39:22

标签: ios objective-c memory-management

所以我遇到了似乎一次又一次解决的问题。不幸的是,我在智慧结束时,所以我会发帖,看看是否有人可以提供帮助。

正如标题所示,我有内存泄漏(无限内存增长)。我可以在Instruments(Allocations)中看到我的InspectionPageTableViewController对象正在被分配,但从未被释放 - 有一个malloc,但是没有相应的free。麻烦的是,我无法看到这是怎么回事。对象的整个历史记录如下所示(从实例化的视图控制器到解雇):

enter image description here

此事件的堆栈跟踪如下所示:

enter image description here

相关方法的代码(在InspectionViewController中)是:

- (void)loadScrollViewWithPage:(NSUInteger)page
{
    NSUInteger numberOfPages = self.titleView.numberOfPages;
    //self.navigationItem.rightBarButtonItem.enabled = page == numberOfPages;

    if (page >= numberOfPages)
    {
        return;
    }

    // replace the placeholder if necessary
    InspectionPageTableViewController *controller = [self.viewControllers objectAtIndex:page];
    if ((NSNull *)controller == [NSNull null])
    {
        controller = [self.storyboard instantiateViewControllerWithIdentifier:@"InspectionPageTableViewController"];
        [self.viewControllers replaceObjectAtIndex:page withObject:controller];
    }

    // Add page to controller
    controller.pageModel = [self.inspectionModel.pages objectAtIndex:page];

    // add the controller's view to the scroll view
    if (controller.view.superview == nil)
    {
        CGRect frame = self.scrollView.frame;
        frame.origin.x = CGRectGetWidth(frame) * page;
        frame.origin.y = 0;
        controller.view.frame = frame;

        [self addChildViewController:controller];
        [self.scrollView addSubview:controller.view];
        [controller didMoveToParentViewController:self];
    }
    [controller.tableView reloadData];
}

当InspectionViewController成功释放时,在这里用行

实例化的InspectionPageTableViewController
controller = [self.storyboard instantiateViewControllerWithIdentifier:@"InspectionPageTableViewController"];

......永远不会。

我尝试从此对象中移除了InspectionPageTableViewController的超视图,并将其从此对象中添加的任何和所有视图中删除(尽管这似乎毫无意义,因为无论如何,调用对象成功释放)。此外,没有出现字符串" InspectionPageTableViewController"在此类之外和InspectionPageTableViewController类本身。

我怀疑UIStoryboard方法-instantiateViewControllerWithIdentifier:但我在SO上看到了几个答案,它说它返回一个自动释放对象。所以这不是问题所在。

有人可以告诉我这里发生了什么吗?如果对该对象有更强的引用,我肯定能够在Instruments的历史记录中看到保留事件吗?

2 个答案:

答案 0 :(得分:0)

仔细阅读你写的内容,我看到两个可能的原因:

2)您正在错误地使用视图控制器包含。 VC遏制是众所周知的棘手问题。您可能没有从self.childViewControllers中删除它(使用正确的方法调用此包含删除操作)

3)如果要将VC添加到导航控制器,则应使用推送和弹出,而不是包含。

答案 1 :(得分:0)

所以有一些错误。我没有记录参考计数'在仪器中启用,所以我没有全面了解。全貌看起来像这样:

enter image description here

在所有的调用中,tableView:viewForHeaderInSection保留,涉及一个对象,其中InspectionPageTableViewController将自己设置为委托。遗憾的是,这个对象的代表财产是“强大的”。一旦设置为“弱”,对象将按预期自动解除分配。所以,再一次,通常的嫌疑人之一'。