我是ios开发的新手,我想了解swift或Objective-C中内存泄漏是如何发生的,谁能用一个小例子来解释一下呢?
谢谢
发布于 2016-04-25 08:31:10
小例子:
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
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捕获f,f捕获c。所以我们的记忆泄露了。
为了处理闭包中的泄漏,您有两个选项--声明捕获的对象是weak或unowned。如下所示:
do {
let c = C()
c.f = { [weak c] in
print(c)
}
}基本上,如果对象有可能在调用闭包时退出并成为nil,则可以使用unowned;但是如果您确信此时仍然存在对象,则使用unowned代替。
在闭包中将c声明为weak后,将打印"deinit“--这意味着一切都已成功释放。
,这对你意味着什么,开发人员?
几乎所有的时间你都不用担心内存管理。这是自动为你做的。对象在你需要的时候就会存在,当你不需要的时候就会消失。但是有两种非常常见的情况,当你需要小心的时候,你需要思考记忆。
weak,除非您有充分的理由不这样做。weak或unowned。关于进一步的信息,我建议你阅读官方的苹果斯威夫特书籍,这可以在iBooks或这里作为一个网站。
https://stackoverflow.com/questions/36834935
复制相似问题