因此,经过深思熟虑,花了一些时间试图寻找内存管理问题,我做了一些研究,最后屈服于改为ARC。它相对无痛。然而,一个新的问题已经出现在我的UIViewControllers上,Pre-arc它们都像宣传的那样工作,我把它们推到了堆栈上,它们出现了,我把它们从堆栈中弹出他们的dealloc方法被调用,每个人都很高兴。切换到ARC,永远不会调用dealloc。这是不幸的。所以我对这个问题做了一些研究,让我列出我在做什么和/或不做什么
。首先,我推送到堆栈的视图没有明确声明为强。
。子类具有父类的委托是unsafe_unretained,但是为了覆盖基础我甚至注释了将委托设置为父级,没有快乐。
。关闭NSzombies显然会导致在启用ARC的代码中留下东西
.i根据Memory not released in ios view hierarchy中的brad larsons回答来改变了我的代码
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,我也读过它是自我保留的,所以你应该在代码块时弱写ref。
我很难过,任何人都可以澄清一下ARC在做什么吗?或者我不喜欢使用ARC?如果您要在ARC中查看视图层次结构的所有视图都不是实例变量?
,以供将来参考 提前谢谢。答案 0 :(得分:3)
我弄清楚问题是什么,但它没有解决那些没有被解除分类的其他控制器,这些完全是出于不同的原因。因此,为了传播知识并减轻其他任何人的痛苦,我将列出可能导致保留周期的事情数量,主要与ARC和UIViewControllers和代码块有关
没有对您正在推动的观点的强烈引用。
如果要推送到视图层次结构的类具有调用push方法的类的委托,则将其设置为unsafe_unretained引用,实际上最好将所有委托unsafe_unretained作为我的代理之一我认为ARC转换器会为我做这件事。
关闭NSZombies。不要过分强调你,只是因为当你需要确保dealloc语句被调用时。
不要直接在代码块中引用self,这会导致保留周期。如果你需要使用self,请在块外面执行以下操作(然后使用weakself)
__ unretained_unsafe className * weakSelf = self;
小心静态引用,我不确定这个,但我有一个方法,它接受了两个实例化的视图控制器并将一个推到另一个之上,引用被分配给它们的两个静态实例类(不要问为什么),在使用它们之后归零它似乎解决了我的问题,我不知道为什么。
这是我不确定的另一个,但看到它在某处提到过一次或两次,如果你在一个类中有一个代码块,尽量不要在该块中使用实例变量,再次使变量__unsafe_unretained。
就是这样,在检查了大部分内容并修复它们之后,我的所有视图都会在每次推送时调用dealloc方法,而不是在一些奇怪的任意点。另外澄清一下这只是一个简短的清单,可以快速帮助任何人面对同样的问题,我并没有声称对这里的一些概念有充分的理解,但我建议你应该,因为我希望及时。 / p>
答案 1 :(得分:0)
这就是仪器存在的原因。运行Leaks仪器,它会告诉你分配那些视图控制器(你已经知道)的内容以及我保留它们的其他内容(你不知道)。
此外,您声称存在内存泄漏但您不知道这一点,直到您运行ObjectAlloc仪器并看到内存使用实际上重复使用攀爬。
答案 2 :(得分:0)
我遇到了同样的问题。
当我从我的项目中禁用NSZombie
选项时,它对我有用。我不知道为什么会这样。