ARC中的[[something retain] autorelease]
相当于什么?
我遇到一个问题,即DBRequest类调用我的委托来表示完成。我的委托然后将DBRequest实例设置为nil,dealloc就是它。但是当堆栈弹出我的委托并跳回DBRequest时,它当然会崩溃。
如果我不在ARC中,在我的委托中我只是在发布我的引用之前做[[theDbRequest retain] autorelease]
,这样它就能存活足够长的时间直到下一个运行循环自动释放它。
我应该在ARC做什么?
答案 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兼容“技巧”。现在,除非您构建自己的自动释放池,否则之前的方法将在当前事件结束时触发。遵循该逻辑尝试:
theDbRequest
设置为nil
,我们就称之为cleanUpTheDbRequest
。[self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO]
,而不是直接将nil
分配给theDbRequest
这应该延迟nil
的分配,直到当前事件结束,就像你的自动释放“技巧”一样。如果您的DBRequest
生活在多个事件中,它也有效 - 前一个方法在调用autorelease
的事件结束时启动,此方法在事件结束时调用委托方法