我是ios开发的新手,我想学习swift
或Objective-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
捕获f
,f
捕获c
。因此,我们发生了内存泄漏。要处理闭包中的泄漏,您有2个选项–声明捕获的对象是
weak
或unowned
。像这样:do {
let c = C()
c.f = { [weak c] in
print(c)
}
}
基本上,如果对象可能不存在而在调用闭包时成为
weak
,则应使用nil
;但如果确定此时对象仍然存在,请改为使用unowned
。在将闭包内的
c
声明为weak
后,将打印“deinit for C” –表示一切都已成功释放。这对您(开发人员)意味着什么?
几乎所有时间您都不必担心内存管理。自动为您完成。对象仅在需要时存在,而在不需要时消失。但是,在两种非常常见的情况下,您需要谨慎考虑内存。
weak
。 weak
或unowned
。 有关更多信息,建议您阅读Apple Swift官方书,该书可以在iBooks或here网站上找到。
关于ios - 如何 swift 发生内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36834935/