所以我遇到了似乎一次又一次解决的问题。不幸的是,我在智慧结束时,所以我会发帖,看看是否有人可以提供帮助。
正如标题所示,我有内存泄漏(无限内存增长)。我可以在Instruments(Allocations)中看到我的InspectionPageTableViewController对象正在被分配,但从未被释放 - 有一个malloc,但是没有相应的free。麻烦的是,我无法看到这是怎么回事。对象的整个历史记录如下所示(从实例化的视图控制器到解雇):
此事件的堆栈跟踪如下所示:
相关方法的代码(在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成功释放时,在这里用行
实例化的InspectionPageTableViewControllercontroller = [self.storyboard instantiateViewControllerWithIdentifier:@"InspectionPageTableViewController"];
......永远不会。
我尝试从此对象中移除了InspectionPageTableViewController的超视图,并将其从此对象中添加的任何和所有视图中删除(尽管这似乎毫无意义,因为无论如何,调用对象成功释放)。此外,没有出现字符串" InspectionPageTableViewController"在此类之外和InspectionPageTableViewController类本身。
我怀疑UIStoryboard方法-instantiateViewControllerWithIdentifier:但我在SO上看到了几个答案,它说它返回一个自动释放对象。所以这不是问题所在。
有人可以告诉我这里发生了什么吗?如果对该对象有更强的引用,我肯定能够在Instruments的历史记录中看到保留事件吗?
答案 0 :(得分:0)
仔细阅读你写的内容,我看到两个可能的原因:
2)您正在错误地使用视图控制器包含。 VC遏制是众所周知的棘手问题。您可能没有从self.childViewControllers中删除它(使用正确的方法调用此包含删除操作)
3)如果要将VC添加到导航控制器,则应使用推送和弹出,而不是包含。
答案 1 :(得分:0)
所以有一些错误。我没有记录参考计数'在仪器中启用,所以我没有全面了解。全貌看起来像这样:
在所有的调用中,tableView:viewForHeaderInSection保留,涉及一个对象,其中InspectionPageTableViewController将自己设置为委托。遗憾的是,这个对象的代表财产是“强大的”。一旦设置为“弱”,对象将按预期自动解除分配。所以,再一次,通常的嫌疑人之一'。