ios - 持有对使用闭包的本地对象的强引用 [Swift]

标签 ios swift memory closures strong-parameters

我有一个关于对使用闭包的本地对象持有强引用的问题。 我有以下代码,其中对象 B 使用一个方法来关闭类型 A 的本地对象。 对象 A 中的方法使用异步操作执行一些网络任务,然后将闭包返回给对象 b。 由于对象 A 在 B 中的方法中是本地的,并且由于我在对象 A 异步任务中使用 [weak self](以防止保留循环),因此对象被释放。

我应该在以下代码中更改什么以确保仅在关闭完成时才释放本地 A 对象?

这是重要代码的一部分:

class A {
    var restAPI: RestAPI?

    func fetchNews(completion: (_ json: [String:Any])->()) {
        // .....
        self.restAPI.fetch(url: url, results: { [weak self] (json) in // 
            completion(json)
        })
        // .....
    }
}

class B {
    // .... 
    // ... call to updateNews()

    func updateNews() {
        let aFetcher: A() 
        aFetcher.fetchNews(completion : { 
            // <<<< // aFetcher gets released and closue never called
            // parse...
        }
    }
}

最佳答案

您将 aFetcher 声明为 func updateNews() 范围内的 let
updateNews() 的范围到达其终点时,aFetcher 将被释放。 你的内部获取函数中有[weak self]。 在此阶段,aFetcher 将被释放,因为 updateNews() 已完成执行并且没有对该对象的强引用。

您只需向类 B 添加变量 aFetcher 以确保您对 aFetcher 具有强引用。

class B {

    // MARK: - Vars
    private let aFetcher = A()

    // MARK: - Public
    func updateNews() {
        aFetcher.fetchNews(completion : {
            // parse...
        }
    }
}

关于ios - 持有对使用闭包的本地对象的强引用 [Swift],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53795889/

相关文章:

ios - 如果触摸了 UITableViewCell 以外的任何地方,则关闭模式

ios - UITapGestureRecognizer 不工作 - Swift 3

r - 如何影响 R 中通过引用传递的对象?

c++ - 访问其他程序使用的内存

ios - 将 NSMutableArray 对象格式化为字符串

ios - 使用 swift 3 更改 iOS 中的按钮标题不起作用

ios - 推送时出现大标题导航栏和搜索栏的错误

ios - 翻转回同一 View Controller 上的另一个 View 通过单击 Swift 3 中的 Alert Ok 按钮

ios - 为什么即使在 Storyboard中嵌入导航 Controller 并使用 push segue 后,我的导航 Controller 仍为零?

c++ - 递归内存错误