2017-05-18 50 views
0

我有一個關於在閉包和HTTP請求中使用[weak self]的問題。將[weak self]用於HTTP請求

作爲例子,我們有誰觸發上完成的蓋的HTTP請求:

func saveBla() { 
    blaManager.saveBla(bla) { error in 
     self.pay5euro() 
    } 
} 

我的問題是:我需要在這裏或不使用弱引用? 首先,我不想在移動到其他頁面後失去api調用的響應。 除此之外,我不想創建一個內存泄漏的保留週期?

func saveBla() { 
    blaManager.saveBla(bla) { [weak self] error in 
     guard let strongSelf = self else { return } 
     strongSelf.pay5euro() 
    } 
} 

是否真的需要使用[弱自我]在這種情況呢?

回答

1

這取決於您的經理和您的控制器的關係。

結論:如果A擁有B和B擁有A而沒有弱引用,它將導致保留週期。

class NetManager { 
    func fire(completion: (_ result: Bool) -> Void) { 
     completion(true) 
    } 
} 


class controler: UIViewController { 
    override func viewDidLoad() { 
     let manager = NetManager() 
     // In this case the Manager and Controller NOT own each other, 
     // And the block will release after request finished, it is ok to not use weak. 
     manager.fire { (result) in 

     } 
    } 


    let manager = NetManager() 
    func anOtherExample() { 
     // In this case the controller own the manager, 
     // manager own the controller, but manager will relase the controller after 
     // request finished, this will cause a delay to controller's relase, but it is still ok. 
     manager.fire { (result) in 

     } 
    } 
} 

如果你的管理這樣的表現,那麼管理者將自己的控制器,它會導致保留週期時,控制器擁有經理。

class NetManager { 

    var completion: ((_ result: Bool) -> Void)? 

    func fire(completion: @escaping (_ result: Bool) -> Void) { 
     self.completion = completion 
    } 
} 

更多細節:https://krakendev.io/blog/weak-and-unowned-references-in-swift

+0

因此,對於使用時關閉有保留週期中最重要的原因,就是當經理將「店」在屬性火功能外完成處理?在我的情況下,我總是把他留在特定的功能,所以他會永遠被釋放? (在某些時候) –

+1

@RPelzer是的,它將在函數完成後發佈。 – BrikerMan