0

因此,经过深思熟虑并在花时间尝试搜索内存管理问题时有点沮丧后,我做了一些研究,最终屈服于更改为 ARC。而且相对无痛。然而,一个与我的 UIViewControllers 相关的新问题浮出水面,弧前它们都像宣传的那样工作,我将它们推入堆栈,它们出现了,我将它们从堆栈中弹出,调用了他们的 dealloc 方法,每个人都很高兴。切换到 ARC,永远不会调用 dealloc。这是不幸的。所以我对这个问题做了一些研究,让我列出我在做什么和/或不做什么

.firstly,我推入堆栈的视图没有明确声明为强。

. 子类拥有的父类的委托是 unsafe_unretained,但是为了覆盖基础,我什至注释掉了将委托设置为父类,这并不令人高兴。

. 关闭 NSzombies 显然这会导致东西停留在启用 ARC 的代码中

.我改变了我的代码,根据布拉德·拉森斯在内存中的答案未在 ios 视图层次结构中发布,从此

if (_friendsListVC == nil) 
{
    _friendsListVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
    _friendsListVC.delegate = self;
}

[self.navigationController pushViewController:_friendsListVC animated:YES]; 

(_friendsListVC 是一个成员变量)。至此

 FriendsListViewController *fVC = [[FriendsListViewController alloc] initWithNibName:nil bundle:nil];
 //fVC.delegate = self;
 [self.navigationController pushViewController:fVC animated:YES]; 

再次没有Joy,dealloc断点永远不会被击中,问题是我在我的应用程序中推送和弹出了很多视图,所以这只会导致更多的内存问题,除了那些我改用ARC希望修复的问题。 ..

另请注意,我在此视图中以及其他一些代码块中都有一些代码块,但我不使用 self ,我也读过它是自我保留的,因此当涉及代码块时,您应该使用弱参考。

我被难住了,谁能解释一下ARC在做什么?或者我不尊重使用ARC做什么?并且为了将来参考,您想要推送到 ARC 中视图层次结构的所有视图都不是实例变量吗?

提前致谢。

4

3 回答 3

3

我弄清楚了问题所在,但它并没有修复没有被释放的其他控制器,这些完全是出于不同的原因。因此,为了传播知识和减轻其他人的痛苦,我将列出可能导致保留周期的事情的数量,主要与 ARC 和 UIViewControllers 和代码块有关

  1. 不要对你正在推进的观点有强烈的参考。

  2. 如果您推送到视图层次结构的类有一个调用推送方法的类的委托,请将其设置为 unsafe_unretained 引用,实际上最好让您的所有委托为 unsafe_unretained,因为我的委托之一是我认为的强ARC转换器会为我做到这一点。

  3. 关闭 NSZombies。不是永远介意你,只是为了当你需要确保在应该调用 dealloc 语句时。

  4. 不要在代码块中直接引用 self,这会导致保留循环。如果需要使用self,在块外执行以下操作(然后使用weakself)

    __unretained_unsafe className *weakSelf = self;

  5. 当心静态引用,我对此不确定,但我有一个方法接受两个实例化的视图控制器并将一个推到另一个之上,引用被分配给这个类中它们的两个静态实例(不要问为什么),在使用后将它们归零后似乎解决了我的问题,我不知道为什么。

  6. 这是另一个我不确定但在某处提到过一次或两次的问题,如果您在类中有代码块,请尽量不要在该块中使用实例变量,再次将变量设为 __unsafe_unretained。

就是这样,在检查了大多数这些并修复它们之后,我的所有视图都会在每次推送时调用它们的 dealloc 方法,而不是在某个奇怪的任意点。另外为了澄清这只是一个简短的清单,可以快速帮助面临相同问题的任何人,我并不声称对这里的一些概念有完全的理解,但我建议你应该这样做,因为我希望能及时。

于 2012-12-11T08:13:51.550 回答
0

我遇到了同样的问题。

当我从我的项目中禁用NSZombie选项时,它对我有用。我不知道为什么会这样。

  • 转到 ProductEdit 方案
  • 禁用 NSZombie
于 2012-12-10T06:48:35.090 回答
0

这正是 Instruments 存在的原因。运行 Leaks 工具,它会告诉您分配这些视图控制器的内容(您已经知道)以及我保留它们的其他内容(您不知道)。

此外,您声称存在内存泄漏,但直到您运行 ObjectAlloc 工具并看到内存使用实际上随着重复使用而攀升,您才知道这一点。

于 2012-12-10T06:33:01.150 回答