我是ios开发的新手,我想学习swiftObjective-C中将如何发生内存泄漏,有人可以用一个小例子来解释一下吗?

谢谢

最佳答案

小例子:

class A {
    var b: B!

    deinit {
        print("deinit of A")
    }
}

class B {
    var a: A!

    deinit {
        print("deinit of B")
    }
}

do {
    let a = A()
    let b = B()
    a.b = b
    b.a = a
}

如果您运行此代码(可能在Playground中),它将不会打印任何内容。这意味着deinit从未调用过两个对象,它们只是泄漏了。

但是,如果您将其中一个属性声明为weak:
class A {
    weak var b: B!

    deinit {
        print("deinit of A")
    }
}

然后deinit将被调用,您将在控制台中看到消息。

编辑:添加带有闭包的示例

考虑以下示例:
class C {
    var f: (Void -> Void)!

    deinit {
        print("deinit for C")
    }
}

do {
    let c = C()
    c.f = {
        print(c)
    }
}
c捕获ff捕获c。因此,我们发生了内存泄漏。

要处理闭包中的泄漏,您有2个选项–声明捕获的对象是weakunowned。像这样:
do {
    let c = C()
    c.f = { [weak c] in
        print(c)
    }
}

基本上,如果对象可能不存在而在调用闭包时成为weak,则应使用nil;但如果确定此时对象仍然存在,请改为使用unowned

在将闭包内的c声明为weak后,将打印“deinit for C” –表示一切都已成功释放。

这对您(开发人员)意味着什么?

几乎所有时间您都不必担心内存管理。自动为您完成。对象仅在需要时存在,而在不需要时消失。但是,在两种非常常见的情况下,您需要谨慎考虑内存。
  • 委派。这是可可粉中的常见模式,如果做错了,它可能会创建保留周期。除非有充分的理由,否则始终将您的委托声明为weak
  • 闭包。闭包捕获周围范围内对象的引用,并自动执行,恕不另行通知。实施闭包时,检查是否会创建保留周期。如果是,则将问题变量声明为weakunowned

  • 有关更多信息,建议您阅读Apple Swift官方书,该书可以在iBooks或here网站上找到。

    关于ios - 如何 swift 发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36834935/

    10-10 09:25