首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >斯威夫特的内存泄漏是如何发生的?

斯威夫特的内存泄漏是如何发生的?
EN

Stack Overflow用户
提问于 2016-04-25 08:00:28
回答 1查看 4.5K关注 0票数 4

我是ios开发的新手,我想了解swiftObjective-C中内存泄漏是如何发生的,谁能用一个小例子来解释一下呢?

谢谢

EN

Stack Overflow用户

回答已采纳

发布于 2016-04-25 08:31:10

小例子:

代码语言:javascript
运行
复制
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
}

如果您运行此代码(可能在游乐场),它将什么也不打印。这意味着deinit从未调用过这两个对象,它们只是泄漏。

但是如果您将其中一个属性声明为weak

代码语言:javascript
运行
复制
class A {
    weak var b: B!

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

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

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

考虑一下这个例子:

代码语言:javascript
运行
复制
class C {
    var f: (Void -> Void)!

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

do {
    let c = C()
    c.f = {
        print(c)
    }
}

c捕获ff捕获c。所以我们的记忆泄露了。

为了处理闭包中的泄漏,您有两个选项--声明捕获的对象是weakunowned。如下所示:

代码语言:javascript
运行
复制
do {
    let c = C()
    c.f = { [weak c] in
        print(c)
    }
}

基本上,如果对象有可能在调用闭包时退出并成为nil,则可以使用unowned;但是如果您确信此时仍然存在对象,则使用unowned代替。

在闭包中将c声明为weak后,将打印"deinit“--这意味着一切都已成功释放。

,这对你意味着什么,开发人员?

几乎所有的时间你都不用担心内存管理。这是自动为你做的。对象在你需要的时候就会存在,当你不需要的时候就会消失。但是有两种非常常见的情况,当你需要小心的时候,你需要思考记忆。

  1. 代表团。这是Cocoa中常见的模式,如果做错了,它可能会创建保留周期。请始终声明您的委托为weak,除非您有充分的理由不这样做。
  2. 关闭。闭包捕获周围范围内对象的引用,并自动执行,无需通知。在执行关闭时,切赫如果会创造保留周期。如果是,请将问题变量声明为weakunowned

关于进一步的信息,我建议你阅读官方的苹果斯威夫特书籍,这可以在iBooks或这里作为一个网站。

票数 15
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36834935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档