swift - 内存管理
值类型与引用类型值类型的生命周期仅取决于它的作用域。因此对于值类型不需要考虑内存管理的问题 引用类型(类、函数、closure)的内存管理: 下方中关于内存管理的讨论仅适用于引用类型 举例1--------- --------- ---------
|object1| |object3| |object4|
--------- --------- ---------
| | .
|强 |强 .弱
|引 |引 .引
|用 |用 .用
| | .
V V V -----------------------------------------
| object2(RC = 2) | -----------------------------------------
RC是对对象强引用的计数 举例2--------- 强引用 --------- 强引用 ---------
|object1| --------> |object2| --------> |object3|
--------- --------- ---------
RC=1 RC=1
当object1不存在时,object2和object3都会被释放掉 举例3RC=2 RC=1
--------- 强引用 --------- 强引用 ---------
|object1| --------> |object2| --------> |object3|
--------- --------- ---------
^ |
|-------------------|
强返向引用
反向引用通常是由于回调函数的使用 RC=2 RC=1
--------- 强引用 ---------
|object2| --------> |object3|
--------- ---------
^ |
|-------------------|
强返向引用
因此反向引用必须是weak 举例3--------- |object1| ---------
|
|
V -----------------------------------------------------
|object2 | -----------------------------------------------------
|var lastName = "Spook" |
|lazy var greet : ()->() = { |
| print("Hello (self.lastName)" |
|} | -----------------------------------------------------
这段代码的问题是自引用 --------- |object1| ---------
|
|
V -----------------------------------------------------
|object2(RC=2) | -----------------------------------------------------
|var lastName = "Spook" | <--
|lazy var greet : ()->() | |
----------------------------------------------------- |
| |
| -------------------------------------
V | -----------------------------------------------------
|{ |
| print("Hello (self.lastName)" |
|} | -----------------------------------------------------
解决方案: lazy var greet : ()->() =
{ [unknown self] in
print("Hello (self.lastName)"
|}
Capture List上文中的[unknown self]就是Capture List 如果把self定义为weak,那么必须把self当作是optional的,使用类型let if的语句对使用if 如果把self定义为unknown,那么self不会成为强引用,且能保证self不为空 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |