繁体   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