[英]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]
我一直在尋找你想要的答案。 我找到了這個答案。 它提到了一篇關於保留周期的文章。 我想你不需要在這里捕捉自己。
alamoFireManager
是self
一個屬性,所以如果它將閉包保存到屬性並且你捕獲self
那么就有一個保留周期。 如果你不確定你應該總是使用weak self
。 這沒有壞處,但在需要時不使用它可能會帶來很多麻煩。 此外, unowned self
是危險的,因為它不是可選的。 如果它是nil
並且您嘗試使用它,您的應用程序崩潰。 你應該使用weak self
。
你的問題是好的,簡單的答案是,不,你不需要在你的響應處理程序中使用[unowned self]
或[weak self]
來使Alamofire正常工作。 無論您是在本示例中創建了自己的SessionManager
,還是使用了利用SessionManager
單例的Alamofire.request
API,您都可以100%選擇調用者。
請求本身的內存管理全部在Alamofire內部管理,利用GCD隊列。 如果您發出請求,只要您在內存中發出請求的SessionManager
,該請求就會完成並調用完成處理程序。 單例SessionManager
顯然不會從內存中釋放。
如果您創建了自己的
SessionManager
,請確保在請求完成之前不釋放它。
這里的問題不應該是關於你是否需要為Alamofire使用無主或弱自我,而是為了你自己。 您是否保證請求成功完成? 如果是,那么你需要在這里捕獲自己並避免弱和無主的自我以確保請求完成。 例如,假設此示例中的self
是Network
類。 如果在請求處於運行狀態時取消分配您的Network
類,那么也將釋放您的自定義alamoFireManager
實例,該實例將使底層URLSession
無效,而該URLSession
將取消您的請求。 通常,您不希望發生這種情況,並且您希望在響應處理程序中捕獲self以確保它不會在過早關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.