我有一个UIViewController A,在这一点上我的记忆是104 Mb。在A中,我通常像这样打开UIVIewController B:
UIViewController *b = [[UIViewController alloc] initWithLevel:level actualUser:actualUser parentViewController:self];
[self presentViewController:b animated:NO completion:nil];
此时我的内存为132 Mb,然后当用户触摸一个按钮时我打开UIViewController C就像这样:
UIViewController *c = [[UIViewController alloc] initWithBlackboard:3];
[self dismissViewControllerAnimated:NO completion:^{
[parentViewController(i get this property in the init method) presentViewController:c animated:NO completion:nil];
}];
在这里,我做的是关闭B然后打开C,所以当我关闭C时它会直接引导我到A.
此时我的记忆是一个153 Mb,这是错误的,因为B的记忆永远不会解除分配(释放)。在此之后,我不这样想回到A:
[self.presentingViewController dismissViewControllerAnimated:NO completion:^{}];
而不是拥有104 Mb我有132 Mb,所以B从未被释放过。窗户以正确的方式打开和关闭,但记忆是问题所在。
我已经分别测试了每个UIViewController,但我没有任何内存问题。问题来自于它们被捆绑在一起。有什么想法吗?
我也一直在寻找内存泄漏,我还没找到任何内容。
答案 0 :(得分:4)
这是循环参考。
@interface A : UIViewController {
UIViewController* B;
}
@end
@interface B : UIViewController {
UIViewController* A;
}
@end
如果您使用具有强引用或默认值的ARC,则会导致内存泄漏..
内存工具仪器并不总是正确的。在某些复杂程序中,要记录保留计数是一种检查发布是否正确的方法。如果使用ARC来管理内存,最好避免循环引用。
此链接是办公室ARC文件,非常详细。 enter link description here
只是一点建议。最好的祝福!
答案 1 :(得分:0)
问题是一个id变量,我永远不会“释放”设置为nil