【问题标题】:what if we retain or autorelease pool? why?如果我们保留或自动释放池怎么办?为什么?
【发布时间】:2011-10-21 12:01:59
【问题描述】:

语言:目标 C

问题:

  • 为什么我们应该始终对自动释放池使用“drain”而不是“release”?
  • 如果[池保留]会发生什么; ?为什么?
  • 如果 [pool autorelease] 会发生什么; ?为什么?

【问题讨论】:

  • 当我们保留或自动释放 autoreleasepool 对象时,它会抛出异常。但我想知道这背后的原因。
  • 为什么我们不能获取或自动释放自动释放池对象??
  • 这是做作业的吗?问题的措辞方式听起来很像。

标签: objective-c ios ios4


【解决方案1】:

The documentation 没有直接回答这个问题。但是,有一个非常明确的答案;因为它没有意义。

P.S:在自动释放池中,drain 和 release 是完全相同的。

【讨论】:

  • 好的,我得到了流失与释放,但不能说服没有意义的答案。你能解释为什么它没有意义吗?
【解决方案2】:

在垃圾回收下,release 充当空操作,而drain 触发垃圾回收,然后release(这是不寻常的),因此drain 应该是清空池的首选方式。根据文档,retainautorelease 被故意禁用。

【讨论】:

  • 根据文档,保留和自动释放已禁用,但想知道其背后的确切原因。
  • 我的观点是让一个简单的api变得更复杂,不需要。例如,将流失作为发布的一部分同样简单。但上述原因是 ARC 中的 @autorelease 块的转变,它将自动释放池从普通对象转变为编译器的构造。
【解决方案3】:

WWDC 2011 Session 323,Introducing Automatic Reference Counting,解释说自动释放池不是真实的对象,所以它们不能被保留。保留自动释放池将导致异常。观看 24:27 的视频或阅读Keynote 的幻灯片 23。您必须是注册开发者才能访问。

在 ARC 下,自动释放语法是一个以@autorelease 开头的范围代码块。根据 Apple 的说法,这种语法更准确地描述了 autorelease 在后台的作用。

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 2013-01-18
    • 2018-08-12
    • 2010-12-18
    • 2010-10-30
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多