[英]What's the equivalent of '[[something retain] autorelease]' in ARC?
ARC中[[something retain] autorelease]
的等價物是[[something retain] autorelease]
?
我有一個問題,類DBRequest調用我的委托來表示完成。 我的委托然后將DBRequest實例設置為nil,dealloc就是它。 但是當堆棧彈出我的委托並跳回DBRequest時,它當然會崩潰。
如果我不在ARC中,在我的委托中,我只是做[[theDbRequest retain] autorelease]
然后釋放我對它的引用,這樣它就能存活足夠長的時間直到下一個運行循環自動釋放它。
我應該怎么做ARC?
如何添加類似的東西
__strong DBRequest * myself = self;
[delegate reportDone];
我認為這會增加自我對象,直到函數結束,防止它早死。
我的委托然后將DBRequest實例設置為nil,dealloc就是它。 但是當堆棧彈出我的委托並跳回DBRequest時,它當然會崩潰。
當然這總是一個糟糕的策略,你的[[theDbRequest retain] autorelease]
總是只是掩蓋了這個問題,是嗎?
什么都不做。 所以你的實例變量堅持不懈; 所以呢? 你知道當你被解除分配時,ARC會為你發布它。
重要的是不要釋放theDbRequest
,而是將dbRequest對你 (委托)的引用設置為nil,所以當你不再存在時它不會試圖回復你。 你自己的dealloc將是一個很好的地方。
希望我正確理解這個問題。 如果沒有,發布一些代碼!
正如@matt所說,如果你只是什么都不做,那么當你的對象被釋放時,ARC應該清理 - 將你創建的DBRequest
分配給一個實例變量處理(當然你提供的對象比你正在創建的對象要長)。
如果你需要在對象死亡之前釋放DBRequest
,那么你需要一個與[[theDbRequest retain] autorelease]
相當的ARC兼容“技巧”。 現在,除非您構建自己的自動釋放池,否則之前的方法將在當前事件結束時觸發。 遵循該邏輯嘗試:
theDbRequest
設置為nil
,讓我們調用cleanUpTheDbRequest
。 [self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO]
而不是直接將nil
分配給theDbRequest
這應該延遲nil
的分配直到當前事件結束之后,就像你的自動釋放“技巧”那樣。 如果您的DBRequest
存在於多個事件中,它也會起作用 - 前一個方法在調用autorelease
的事件結束時啟動,此方法在事件結束時調用委托方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.