簡體   English   中英

ARC中的'[[something retain] autorelease]相當於什么?

[英]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兼容“技巧”。 現在,除非您構建自己的自動釋放池,否則之前的方法將在當前事件結束時觸發。 遵循該邏輯嘗試:

  1. 在你的類中添加一個方法,只需將theDbRequest設置為nil ,讓我們調用cleanUpTheDbRequest
  2. 更改你的委托回調以調用[self performSelectorOnMainThread:@selector(cleanUpTheDbRequest) withObject:nil waitUntilDone:NO]而不是直接將nil分配給theDbRequest

這應該延遲nil的分配直到當前事件結束之后,就像你的自動釋放“技巧”那樣。 如果您的DBRequest存在於多個事件中,它也會起作用 - 前一個方法在調用autorelease的事件結束時啟動,此方法在事件結束時調用委托方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM