ARC中的 autorelease]相当于什么?

ARC中的[[something retain] autorelease]相当于[[something retain] autorelease]

我有一个类DBRequest调用我的委托来表示完成的问题。 然后,我的委托设置DBRequest实例为零,这是dealloc的。 但是,当堆栈popup我的委托,并跳回到DBRequest,它当然然后崩溃。

如果我不在ARC中,在我的委托中,我只是在释放引用之前执行[[theDbRequest retain] autorelease] ,以便它能够存活足够长的时间,直到下一个运行循环自动释放为止。

我应该在ARC做什么?

如何添加类似的东西

 __strong DBRequest * myself = self; [delegate reportDone]; 

我认为这会增加自己的对象,直到函数的结束,以防止它早日死亡。

然后,我的委托设置DBRequest实例为零,这是dealloc的。 但是当堆栈popup我的委托并跳回DBRequest时,它当然然后崩溃。

当然,这总是一个不好的策略,而你的[[theDbRequest retain] autorelease]一直只是掩盖问题,是的?

什么也不做。 所以你的实例variables保持不变 所以呢? 你知道,当你被交易时,ARC会为你释放它。

重要的是不要释放theDbRequest ,而是要将DbRequest对 (委托)的引用设置为零,所以当你不存在的时候,它不会试图给你回电。 你自己的dealloc将是一个很好的地方。

希望我正确理解这个问题。 如果没有,发布一些代码!

正如@matt所说的,如果你什么都不做,ARC应该在你的对象被释放的时候清理DBRequest – 把你创build的DBRequest分配给一个实例variables来处理(当然你的对象提供的是你创build的对象)。

如果你需要你的对象死亡之前释放DBRequest 那么你需要一个与[[theDbRequest retain] autorelease]等效的ARC兼容的“技巧”。 现在,除非您正在构build自己的自动发布池,否则以前的方法会在当前事件结束时触发。 遵循这个逻辑尝试:

  1. 添加一个方法到你的类,只需theDbRequest设置nil ,我们称之为cleanUpTheDbRequest
  2. 改变你的委托callback,以调用[self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO]而不是直接将nil theDbRequest

这应该延迟到当前事件结束之前的nil分配,就像你的自动释放“技巧”一样。 如果您的DBRequest存在于多个事件中,它也可以工作 – 前一个方法在调用autorelease的事件结束时启动,此方法在调用委托方法的事件结束时执行。