2017-05-25 42 views
0

我嘗試封裝大多數操作我的異步活動,而且往往我有啓動其他操作等操作......如何實現迅速關閉單向引用

,我現在面臨的問題當我參考原始操作時,可以在連續操作完成之前取消分配。如果我有weak self,weak me = self(災難性地)unowned me = self到位,我使用的關閉失敗;但如果沒有他們使用self,那麼這兩個操作都不會釋放(內存泄漏)。

是否有可能在閉包內保持引用活着而不創建雙向循環引用情形?

回答

0

首先,您需要問自己,您的self未來是否會變爲零。如果是,則weakunowned進來圖片。

安全的方法是使用weak,然後檢查它是否已被釋放。

your-closure { [weak self] in 
     guard let strongSelf = self else { 
      print("self is been deallocated") 
      return 
     } 
    } 

當閉包在上述情況下運行時,它將只捕獲weak self。在關閉的瞬間,weak self要麼是self,要麼是零。您可以測試以確定是否設置了strongSelf

如果weak self等於self,那麼strongSelf保留它,並且它保持保留直到它被釋放時關閉返回。這是全部或沒有。

+0

我明白了。我的問題是關於你的回答中的'如果不是'部分。如果我試圖阻止自己在將來沒有永久分配到內存中,那麼該怎麼辦?因爲我正在使用ops,所以它們會耗盡並終止,除非我創建了一個perm鏈接,但我在問是否有辦法避免這種情況。 –

+0

我想要原始操作進行環聊直到完成它,然後才能釋放它。 –

+0

@JamesLingo在這種情況下,你將不得不使用強大的自我保持「操作」。這裏沒有別的選擇。只有在這種情況下,自我的一生纔會延續到塊完成後。另請注意,無論「Self」是否仍然存在或已在同一時間內被釋放,塊最終都會被執行。 – Rahul