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

时间:2016-02-24 02:12:08

标签: ios swift alamofire

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

我是否需要在封闭内部拥有无主的自我,或者它已经被图书馆照顾了?

3 个答案:

答案 0 :(得分:1)

使用Alamofire.request代替self.alamoFireManager,您可以在不抓住自我的情况下继续前进。如果你真的需要使用self.alamoFireManager,正如@Tapani所提到的那样,因为alamoFireManager是self的属性,你需要捕获self并在闭包中使用[weak self]

我正在寻找你想要的答案。我找到了this回答。它提到了一篇关于保留周期的文章。我想你不需要在这里捕捉自己。

答案 1 :(得分:0)

alamoFireManagerself的属性,因此如果将闭包保存到属性并捕获self,则会有一个保留周期。如果您不确定是否应始终使用weak self。这没有坏处,但在需要时不使用它可能会带来很多麻烦。此外,unowned self很危险,因为它不是可选的。如果它是nil并且您尝试使用它,那么您的应用就会崩溃。您应该使用weak self代替。

答案 2 :(得分:0)

您的问题是一个很好的问题,简单的答案是不,您不需要在响应处理程序中使用[unowned self][weak self]即可使Alamofire正常工作。调用者可以选择100%,取决于您(如本例中那样)创建自己的SessionManager,还是使用Alamofire.request API来利用SessionManager单例。

Alamofire内部构件

请求本身的内存管理全部在Alamofire内部利用GCD队列进行管理。如果发出请求,只要您发出请求的SessionManager停留在内存中,该请求就会完成并调用完成处理程序。单例SessionManager显然不会从内存中释放。

  

如果您创建了自己的SessionManager,请确保在请求完成之前不要释放它。

其他想法

这里的问题不应该仅仅是为了Alamofire的需要而使用无主或弱小的自我,而是为了自己。您是否保证请求成功完成?如果是,那么您需要在此处捕获自己,并避免使用弱无用的自己,以确保请求完成。例如,假设本示例中的selfNetwork类。如果您在请求进行过程中取消分配Network类,这还将取消分配您的自定义alamoFireManager实例,这将使基础URLSession无效,从而取消您的请求。通常,您不希望发生这种情况,并且希望将自己捕获到响应处理程序中以确保它不会过早关闭。