ios - 无限内存增长 - iOS

标签 ios objective-c swift memory-management properties

已解决

我正在阅读 raywenderlich 博客中的这篇文章: http://www.raywenderlich.com/23037/how-to-use-instruments-in-xcode 了解乐器并弄清楚我是否在一些旧项目中做错了什么。

我已经看到,在我的代码的一个特定点,当我显示一个最终关闭的模态视图时,分配的内存仍然存在。如下图所示。

enter image description here

执行产生了 4 个标记。 在 2n 和 3t 标记之间,显示 View ,如您所见,分配了新内存。 但是在 3t 和 4th 之间,我调用了 dismissViewController, View 不再存在。但内存仍处于分配状态。

所有属性都被创建为 strong(可能不是最好的方法):

enter image description here enter image description here

我有一个 NSTimer,它在 viewDidLoad 方法中初始化,并在 viewWillDisappear 处设置为 nil:

[self.secondTimer invalidate];
self.secondTimer = nil;

那么,你知道发生了什么事吗?据我所知,即使属性被声明为 strong,当 UIViewController 被释放时,它们也会被释放到。

编辑

感谢大家,我提供的信息还不够。

如您所见,QRViewController 继承自 BaseViewController。

这个 Controller 有一个委托(delegate)被定义为强存储,太糟糕了。

就这样吧。

最佳答案

在 View Controller 层次结构中,self.viewstrong 保存他的所有 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 一个 selfweak 版本,只有当 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/

相关文章:

ios - 取消链接 AWS 链接登录的问题(例如 Facebook)

swift - MPVolumeView 缩略图未正确水平绘制

ios - 使用双击手势识别器和快速流关闭手势识别器

html - iOS 版 Chrome 和 Safari 上的背景图片

ios - 如何在 Swift 中检测图像中的条形码?

ios - UIView autoresizingMask 在设置不同的固定左右边距和灵活宽度时出现错误?

ios - 第二次设置核心数据对象会导致 EXC_BAD_ACCESS

iphone - 如何使用 componentsSeparatedByString :? 忽略包含子字符串的单词

iphone - iOS7自定义按钮高亮时变透明

ios - 如何为内部测试人员在 Testflight 中创建多个构建