【问题标题】:iOS + React Native - memory leaksiOS + React Native - 内存泄漏
【发布时间】:2019-05-31 13:09:29
【问题描述】:

我正在考虑用 React Native 制作一个 iOS 项目。在 iOS 上,查找和修复所谓的“保留周期”是一个大问题,即当两个对象存储 strong 相互引用时:

class Obj1 {
    var delegate: Obj2?
}

class Obj2 {
    var delegate: Obj1?
}


let obj1 = Obj1()
let obj2 = Obj2()

obj1.delegate = obj2
obj2.delegate = obj1

React Native 是否有内存泄漏或保留周期的概念? JS 对应的类似代码会在 React Native 环境中创建一个保留循环吗?

传递一个捕获self 的闭包怎么样?这也会在 React Native 中造成内存泄漏吗?

总结:

  1. 列出的示例代码(重写为 JS)会导致 RN 中的内存泄漏吗?
  2. 在闭包中捕获self 会导致内存泄漏吗?

【问题讨论】:

    标签: ios react-native memory-leaks automatic-ref-counting react-native-ios


    【解决方案1】:

    你真的不应该让两个对象相互保持强引用,委托模式通常通过一个强引用和一个弱引用来处理,其中委托是弱引用。

    现在回答你的问题:

    1. 可能,但其他人可能会给你一个更好的答案,因为我对 RN 并不完全确定。

    2. 是与否,取决于您如何处理。

    如果你使用强self,那么肯定会有内存泄漏:

    { _ in
        self.doSomething()
    }
    

    更好的方法是使用弱自我:

    { [weak self] _ in
        guard let self = self else { return }
        self.doSomething()
    }
    

    如果您可以保证 self 在闭包中始终可用,则为 unowned self:

    { [unowned self] _ in
        self.doSomething()
    }
    

    【讨论】:

    • 您好,感谢您的回答!我明白了,你的代码示例是用 Swift 编写的,我完全同意内存泄漏。但是,我添加这些示例只是为了说明一点。问题是关于 JavaScript 和 React Native 环境的。由于我是 JS 的初学者,我想对内存泄漏的概念有一个答案,无论它们在 RN + JS 环境中是否可能。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多