Objective c 如果我们保留或自动释放池怎么办?为什么?

Objective c 如果我们保留或自动释放池怎么办?为什么?,objective-c,ios,ios4,Objective C,Ios,Ios4,语文:目标C 问题: 对于自动释放池,为什么总是使用“排水”而不是“释放” 如果[池保留];,会发生什么?为什么? 如果[池自动释放];,会发生什么?为什么? 没有给出直接的答案。但是,有一个非常明确的答案;因为这毫无意义 注意:在自动释放池中,释放和释放是完全相同的事情。在垃圾收集下,release充当no-op,而drain触发垃圾收集,然后release(这是不寻常的),因此drain应该是清空池的首选方式保留和自动释放被故意禁用。WWDC 2011会话323说明自动释放池不是真实对象,

语文:目标C

问题:

  • 对于自动释放池,为什么总是使用“排水”而不是“释放”
  • 如果[池保留];,会发生什么?为什么?
  • 如果[池自动释放];,会发生什么?为什么?
    • 没有给出直接的答案。但是,有一个非常明确的答案;因为这毫无意义


      注意:在自动释放池中,释放和释放是完全相同的事情。

      在垃圾收集下,
      release
      充当no-op,而
      drain
      触发垃圾收集,然后
      release
      (这是不寻常的),因此
      drain
      应该是清空池的首选方式<根据文档,代码>保留和
      自动释放
      被故意禁用。

      WWDC 2011会话323说明自动释放池不是真实对象,因此无法保留。保留自动释放池将导致异常。在24:27观看视频或阅读。您必须是注册的开发人员才能访问


      在ARC下,autorelease语法是一个范围有限的代码块,前面有
      @autorelease
      。根据苹果公司的说法,这种语法更准确地描述了autorelease在引擎盖下的功能。

      当我们保留或自动释放autoreleasepool对象时,它会引发异常。但我想知道这背后的原因。为什么我们不能释放或自动释放自动释放池对象??这是做作业用的吗?这个问题的措辞让它听起来像是。好吧,我得到了drain vs release,但没有说服你不要给出有意义的答案。你能解释一下为什么它没有意义吗?根据doc,retain和autorelease被禁用了,但我想知道这背后的确切原因。我的观点是,这样做是为了让一个简单的api更加复杂,而不需要。例如,将排水作为释放的一部分同样简单。但是声明的原因是ARC中转向@autorelease块,这将autorelease池从普通对象转变为编译器的构造。