0

我有一个关于是否需要在闭包和 HTTP 请求中使用 [weak self] 的问题。

例如,我们有一个 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()
    }
}

在这种情况下真的需要使用[弱自我]吗?

4

1 回答 1

2

这取决于您的经理和您的控制器的关系。

结论:如果 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

于 2017-05-18T14:56:42.367 回答