已解决
我正在阅读 raywenderlich 博客中的这篇文章: http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode 了解乐器并弄清楚我是否在一些旧项目中做错了什么。
我已经看到,在我的代码的一个特定点,当我显示一个最终关闭的模态视图时,分配的内存仍然存在。如下图所示。
执行产生了 4 个标记。 在 2n 和 3t 标记之间,显示 View ,如您所见,分配了新内存。 但是在 3t 和 4th 之间,我调用了 dismissViewController, View 不再存在。但内存仍处于分配状态。
所有属性都被创建为 strong(可能不是最好的方法):
我有一个 NSTimer,它在 viewDidLoad 方法中初始化,并在 viewWillDisappear 处设置为 nil:
[self.secondTimer invalidate];
self.secondTimer = nil;
那么,你知道发生了什么事吗?据我所知,即使属性被声明为 strong,当 UIViewController 被释放时,它们也会被释放到。
编辑
感谢大家,我提供的信息还不够。
如您所见,QRViewController 继承自 BaseViewController。
这个 Controller 有一个委托(delegate)被定义为强存储,太糟糕了。
就这样吧。
最佳答案
在 View Controller 层次结构中,self.view
用 strong
保存他的所有 subview ,所以 self.view
下的所有内容(可能是你所有的IBOutlet
属性)可以切换到 weak
。但这可能无法解决问题。
可能对您有帮助的事实是,您拥有的任何 block
都将该 block 中使用的每个对象都保存为强对象,以确保该 block 可以在当时运行它的代码。如果没有任何内容包含该 block (如 animationWithDuration:
),则不用担心。但是如果你有一个对象持有的任何 block (比如对象的“完成 block ”或 block 的任何其他创造性使用),该 block 内的所有内容都将是 strong
,并且你有机会创建这样的保留周期。例如:呈现 View Controller 使用完成 block 调用呈现的 View Controller ,并且在该 block 中使用 self
。现在 presented VC 持有一个 block 以在 dismiss 时执行,而该 block 持有 presenting VC。当被解雇时,你最终会得到一个持有一个区 block 的 VC,这个区 block 持有一个持有所呈现的 VC 的 VC....
一个简单的解决方案是给 block 一个 self
的 weak
版本,只有当 block 执行时,才让它成为 strong
运行 block 的时间(为了避免在运行 block 时释放内存):
__weak myViewController *weakself = self;
[self.someObject setBlockHandler:^(BOOL foo){
myViewController *strongself = weakself;
if (strongself) {
// Do whatever...
}
}];
关于ios - 无限内存增长 - iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22637462/