【问题标题】:Are retain cycles okay sometimes?保留周期有时可以吗?
【发布时间】:2014-05-09 08:10:26
【问题描述】:

假设我有一个对象应该在应用程序的整个生命周期中作为单例存在。这个对象是否可以包含,比如说,对NSTimer 的强引用,并将其自身作为计时器的目标?这将是一个保留周期,但我没有看到任何不利因素。当操作系统尝试释放内存时,无论如何都不需要调用dealloc

【问题讨论】:

  • 我想知道:你最终会使计时器无效吗?您最终是否将计时器引用设置为 nil?换句话说,我理解一个永远存在的单例对象的意义,但是拥有一个永远存在的 NSTimer 对象有什么意义吗?
  • 如果计时器打算在应用程序的生命周期内运行,我想知道为什么我需要使无效或设置为零......除了清理之外还有什么理由吗?这种清理的目的是什么?
  • NSTimer 不应由您保留。添加到 NSRunLoop 时系统会保留。
  • @Rafal 保留 NSTimer 没有错。
  • 如果对象在应用程序的整个生命周期中都存在,那么有一个保留周期是完全可以的。由于您永远不需要释放它,因此保留周期不会受到任何伤害。

标签: cocoa-touch cocoa memory-management retain-cycle


【解决方案1】:

没有保留周期。计时器在完成射击后释放其目标。

保留周期是两个对象永远相互保留。不是临时的。

【讨论】:

  • OP 在问题下的评论强烈暗示这是一个重复计时器。
  • @JoshCaswell 是的,但如果它是一个重复计时器,那么出于某种原因必须需要它吗?一旦你阻止它重复,它就会释放它的目标。
  • @AbhiBeckert 在 cmets 中阅读我问他的内容和他说的内容。计时器永不停止(就像爵士鼓独奏:)
  • 对;对你和我来说显而易见的东西(如果你需要它留下来,它必须保留)对提问者来说似乎并不明显。因此问题。
  • @JoshCaswell 因此我的回答与马特的回答不同——他完全避免使用 NSTimer 组件。当一个对象是单例时,保留循环很好,但这不会改变这不是保留循环的事实。
【解决方案2】:

听起来不错。您有一个单例对象,这意味着一旦创建,它将在应用程序的整个生命周期内持续存在。为了配合它,您有一个计时器,该计时器也将在应用程序的整个生命周期内持续存在。因此,一旦您确保了它们的持久性(即它们都被保留),就没有需要管理的内存了。只要应用程序存在,它们就会一直存在,在这种情况下,这正是您想要的。正如您的问题所暗示的那样,故事中存在一个保留 循环 的事实(由于 NSTimer 的特殊性)几乎是次要的。

【讨论】:

  • @JoshCaswell 好点。我将编辑为“只要应用存在”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多