【问题标题】:Not sure if it's a memory leak (ARC)不确定是否是内存泄漏 (ARC)
【发布时间】:2014-09-01 15:12:18
【问题描述】:

我正在编写自定义动画,我怀疑我有内存泄漏,但我不确定。每次我运行给定的动画时,内存都会增加一点,但不会减少。为了确保,我做了一个测试:

NSLog(@"%@", self.weakanim);

// The animation collection to run
HyAnimationCollection * collection = [[HyAnimationCollection alloc] init];

self.weakanim = collection;

首先记录nil,然后它总是记录一个地址。所以这里有两个指标:

  1. 内存从 9.7MB 开始,每运行 10 次动画就会增加 0.1MB。我对此进行了测试,大约为 12MB。现在,应该每次都释放内存还是只是 ARC(比如 JVM 的垃圾收集器)只定期释放内存?也就是说,也许它不是泄漏,而是 ARC 还没有发布它,因为我没有达到一定的数量。
  2. 我将weakanim 声明为weak 只是为了查看之前的动画合集是否正在发布,但同样的问题仍然存在:ARC 是否还没有发布

【问题讨论】:

  • 您的描述似乎有泄漏。使用 Instruments 了解未发布的内容。 friday.com/bbum/2010/10/17/…
  • 多么棒的工具!它已经固定在我的底座上。还在研究它。谢谢!

标签: ios objective-c memory memory-management memory-leaks


【解决方案1】:
  1. ARC 不像 JVM 那样工作。你得到的最接近的是当它使用“自动释放池”时。在这种情况下,直到运行循环结束,对象才会关联。如果您可以看到动画正在运行,则很有可能运行循环正在运行,并且应该定期刷新池。

  2. 显示是否存在泄漏的更好方法是在 HyAnimationCollection 类的 dealloc 方法中放置一个断点。如果您的其余调查是正确的,我的猜测是它永远不会被调用。您可能在那个代码中有一个保留周期。

【讨论】:

  • 但是如果池被定期刷新,我怎么能确定 dealloc 方法已经被调用了呢?另外,我应该覆盖dealloc 吗?我不能打电话给[super dealloc],因为 ARC 禁止这样做。
  • 它与垃圾收集器“定期”工作的方式不同。基本上,如果您的应用程序是响应式的——动画正在运行,屏幕上的点击被响应——运行循环正在工作并且自动释放池正在耗尽。是的,使用 ARC 时,您只需覆盖 dealloc
  • 我明白了。然后是泄漏。
  • @AndréFratelli 在 ARC 下覆盖 -dealloc 时,不要调用 [super dealloc][super dealloc]-dealloc 的末尾被ARC 自动调用,并且所有__strong iVar 都被释放。 (另见:ARC docs
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 2012-09-14
  • 2012-10-05
  • 1970-01-01
  • 2012-09-13
  • 2020-07-22
  • 2010-10-13
  • 2019-01-28
相关资源
最近更新 更多