[自我]如何在斯威夫特身上工作?它就像[无主的自我]或强烈的参照



我知道[弱自我]和[无主自我],但我不知道[自我]。

它是如何工作的?

[self]=[无主的self][self]=strong参考

通过捕获子句捕获变量:

var closure = { [x] in x.doSomething() }

将创建x在创建闭包时引用的值的强捕获。请参见末尾的示例。

如果您没有像中那样使用捕获子句

var closure = { x.doSomething() }

这将创建一个对x在执行时引用的值的强引用

也就是说,捕获[self]会创建一个强引用,但这是完全没有必要的,除非您预计self在某个时间点发生变化(这将是非常不寻常的(。


示例

class ValueClass {
var value:String

init (_ v:String)   { value = v }

func info()         { print("(value)") }
deinit              { print ("deinit: (value)") }
}
if (1==1) {
print (">> No capture clause")
var a:ValueClass? = ValueClass("a")
let closure = { a != nil ? a!.info() : print("a is nil") }
a = ValueClass("changed a")     // "deinit: a"
closure()   // "a is nil"
print ("<< done")
}// "deinit: changed a"
print ("------------------------------")
if (1==1) {
print (">> strong capture clause")
var b:ValueClass? = ValueClass("b")
let closure = { [b] in b != nil ? b!.info() : print("b is nil") }
b = ValueClass("changed b")
closure()                   // "b"
print ("<< done")
}                               // "deinit: b"; "deinit: changed b"
print ("------------------------------")
if (1==1) {
print (">> weak capture clause")
var c:ValueClass? = ValueClass("c")
let closure = { [weak c] in c != nil ? c!.info() : print("c is nil") }
c = ValueClass("changed c")     // "deinit: c"
closure()                       // "c is nil"
print ("<< done")
}                                   // "deinit: changed c"
print ("------------------------------")
if (1==1) {
print (">> unowned capture clause")
var d:ValueClass? = ValueClass("d")
let closure = { [unowned d] in d != nil ? d!.info() : print("d is nil") }
d = ValueClass("changed d")     // "deinit: d"
closure()   // error: Execution was interrupted, reason: signal SIGABRT.
print ("<< done")
}

输出为

>> No capture clause
deinit: a
changed a
<< done
deinit: changed a
------------------------------
>> strong capture clause
b
<< done
deinit: b
deinit: changed b
------------------------------
>> weak capture clause
deinit: c
c is nil
<< done
deinit: changed c
------------------------------
>> unowned capture clause
deinit: d
(CRASH)

正如你所看到的,

  • 当使用no capture子句时,使用执行时的值("changed a"(
  • 当使用[b]时;b";由于b是"0";b";在创建时
  • 当使用[weak c]时;c";创建;由于c已经变为"0";改变c";,旧的";c";因此捕获为零并且输出为"0";c为零">
  • 使用[unowned c]时相同,只是程序崩溃

最新更新