ARC中的'[[something retain] autorelease]相当于什么?

时间:2012-03-10 03:50:37

标签: iphone objective-c ios automatic-ref-counting

ARC中的[[something retain] autorelease]相当于什么?

我遇到一个问题,即DBRequest类调用我的委托来表示完成。我的委托然后将DBRequest实例设置为nil,dealloc就是它。但是当堆栈弹出我的委托并跳回DBRequest时,它当然会崩溃。

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

我应该在ARC做什么?

3 个答案:

答案 0 :(得分:6)

如何添加类似

的内容
__strong DBRequest * myself = self;
[delegate reportDone];

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

答案 1 :(得分:3)

  

我的委托然后将DBRequest实例设置为nil,dealloc就是它。但是当堆栈弹出我的委托并跳回DBRequest时,它当然会崩溃。

这肯定是一个糟糕的策略,你的[[theDbRequest retain] autorelease]总是只是掩盖这个问题,是吗?

什么都不做。所以你的实例变量坚持不懈;所以呢?你知道,当你被解除分配时,ARC会为你发布它。

重要的是不要释放theDbRequest,而是将theDbRequest对(委托)的引用设置为nil,所以当你没有时它不会试图回复你更长的存在。你自己的dealloc将是一个很好的地方。

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

答案 2 :(得分:3)

正如@matt所说,如果你只是什么都不做,那么当你的对象被释放时,ARC应该清理 - 将你创建的DBRequest分配给一个实例变量处理(提供当然你的对象比你正在创造的对象长得多。

如果您需要在之前取消分配DBRequest ,那么您需要与[[theDbRequest retain] autorelease]等效的ARC兼容“技巧”。现在,除非您构建自己的自动释放池,否则之前的方法将在当前事件结束时触发。遵循该逻辑尝试:

  1. 向您的班级添加一个方法,只需将theDbRequest设置为nil,我们就称之为cleanUpTheDbRequest
  2. 更改您的委托回调以调用[self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO],而不是直接将nil分配给theDbRequest
  3. 这应该延迟nil的分配,直到当前事件结束,就像你的自动释放“技巧”一样。如果您的DBRequest生活在多个事件中,它也有效 - 前一个方法在调用autorelease的事件结束时启动,此方法在事件结束时调用委托方法