簡體   English   中英

我是否需要AlamoFire中的[無主自我],或者它已被照顧?

[英]Do I need [unowned self] in AlamoFire, or is it already taken care of?

        let parameters = [
            "access_token": access_token,
        ]
        self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/auth", parameters: parameters).responseJSON { [unowned self]
            response in
            self.startWorking()
        }

我是否需要在封閉內部擁有無主的自我,或者它已經被圖書館照顧了?

使用Alamofire.request而不是self.alamoFireManager ,你很高興不去捕捉自己。 如果你真的需要使用self.alamoFireManager ,正如@Tapani所提到的,因為alamoFireManager是self的屬性,你需要捕獲self並在閉包中使用[weak self]

我一直在尋找你想要的答案。 我找到了這個答案。 它提到了一篇關於保留周期的文章。 我想你不需要在這里捕捉自己。

alamoFireManagerself一個屬性,所以如果它將閉包保存到屬性並且你捕獲self那么就有一個保留周期。 如果你不確定你應該總是使用weak self 這沒有壞處,但在需要時不使用它可能會帶來很多麻煩。 此外, unowned self是危險的,因為它不是可選的。 如果它是nil並且您嘗試使用它,您的應用程序崩潰。 你應該使用weak self

你的問題是好的,簡單的答案是,不,你不需要在你的響應處理程序中使用[unowned self][weak self]來使Alamofire正常工作。 無論您是在本示例中創建了自己的SessionManager ,還是使用了利用SessionManager單例的Alamofire.request API,您都可以100%選擇調用者。

Alamofire Internals

請求本身的內存管理全部在Alamofire內部管理,利用GCD隊列。 如果您發出請求,只要您在內存中發出請求的SessionManager ,該請求就會完成並調用完成處理程序。 單例SessionManager顯然不會從內存中釋放。

如果您創建了自己的SessionManager ,請確保在請求完成之前不釋放它。

額外的想法

這里的問題不應該是關於你是否需要為Alamofire使用無主或弱自我,而是為了你自己。 您是否保證請求成功完成? 如果是,那么你需要在這里捕獲自己並避免弱和無主的自我以確保請求完成。 例如,假設此示例中的selfNetwork類。 如果在請求處於運行狀態時取消分配您的Network類,那么也將釋放您的自定義alamoFireManager實例,該實例將使底層URLSession無效,而該URLSession將取消您的請求。 通常,您不希望發生這種情況,並且您希望在響應處理程序中捕獲self以確保它不會在過早關閉。

暫無
暫無

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

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