let parameters = [
"access_token": access_token,
]
self.alamoFireManager!.request(.POST, CONSTANTS.APIEndpoint+"/auth", parameters: parameters).responseJSON { [unowned self]
response in
self.startWorking()
}
我是否需要在封闭内部拥有无主的自我,或者它已经被图书馆照顾了?
答案 0 :(得分:1)
使用Alamofire.request
代替self.alamoFireManager
,您可以在不抓住自我的情况下继续前进。如果你真的需要使用self.alamoFireManager
,正如@Tapani所提到的那样,因为alamoFireManager
是self的属性,你需要捕获self并在闭包中使用[weak self]
我正在寻找你想要的答案。我找到了this回答。它提到了一篇关于保留周期的文章。我想你不需要在这里捕捉自己。
答案 1 :(得分:0)
alamoFireManager
是self
的属性,因此如果将闭包保存到属性并捕获self
,则会有一个保留周期。如果您不确定是否应始终使用weak self
。这没有坏处,但在需要时不使用它可能会带来很多麻烦。此外,unowned self
很危险,因为它不是可选的。如果它是nil
并且您尝试使用它,那么您的应用就会崩溃。您应该使用weak self
代替。
答案 2 :(得分:0)
您的问题是一个很好的问题,简单的答案是不,您不需要在响应处理程序中使用[unowned self]
或[weak self]
即可使Alamofire正常工作。调用者可以选择100%,取决于您(如本例中那样)创建自己的SessionManager
,还是使用Alamofire.request
API来利用SessionManager
单例。
请求本身的内存管理全部在Alamofire内部利用GCD队列进行管理。如果发出请求,只要您发出请求的SessionManager
停留在内存中,该请求就会完成并调用完成处理程序。单例SessionManager
显然不会从内存中释放。
如果您创建了自己的
SessionManager
,请确保在请求完成之前不要释放它。
这里的问题不应该仅仅是为了Alamofire的需要而使用无主或弱小的自我,而是为了自己。您是否保证请求成功完成?如果是,那么您需要在此处捕获自己,并避免使用弱无用的自己,以确保请求完成。例如,假设本示例中的self
是Network
类。如果您在请求进行过程中取消分配Network
类,这还将取消分配您的自定义alamoFireManager
实例,这将使基础URLSession
无效,从而取消您的请求。通常,您不希望发生这种情况,并且希望将自己捕获到响应处理程序中以确保它不会过早关闭。