[英]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.