有人可以帮忙解释为什么obj2会脱离? (我认为有一个保留周期)
obj2和obj1是如此相似: 它们都有一个名为printNameLength的属性,它们都是一个闭包,它都捕获自己(或者它是?)。
但是obj2得到了deinit(而obj1没有,因为有一个保留周期),它让我感到惊讶,我无法弄清楚原因。
非常感谢。
class myClass1 {
var name: String
lazy var printNameLength: ( () -> Int ) = { // [unowned self]
return self.name.characters.count // retain cycle here
}
init(name: String){
self.name = name
}
deinit {
print("deinit myClass1: \(name)")
}
}
var obj1: myClass1? = myClass1.init(name: "obj1")
print(obj1!.printNameLength())
obj1 = nil // never get deinit
class myClass2{
var name: String
init(name: String){
self.name = name
}
var printNameLength: ( () -> Int )?
deinit {
print("deinit myClass2: \(name)")
}
}
var obj2: myClass2? = myClass2.init(name: "obj2")
obj2!.printNameLength = {
return obj2!.name.characters.count // no retain cycle here?
}
print(obj2!.printNameLength!())
obj2 = nil // get deinit
答案 0 :(得分:0)
在第二种情况下,最初会有一个保留周期,但是当您将变量package formatting_problem;
import java.util.Scanner;
public class DateFormatter {
public static void main(String[] args) {
Integer day = 0;
Integer month = 0;
Integer year = 0;
Integer test = null;
Scanner input = new Scanner(System.in).useDelimiter("/");
System.out.println("Enter a date in the format XX/XX/XXXX to be formatted to Month Day,Year");
while (input.hasNext()){
month = input.nextInt();
day = input.nextInt();
year = input.nextInt();
System.out.println();
}
设置为obj2
时它会被破坏。
在Swift中,闭包通过引用捕获变量(比如当被捕获的变量被声明为nil
时在Objective-C中发生的事情),而不是值,因此闭包之外的变量赋值会反映在闭包中(和反之亦然)。闭包只通过引用捕获的__block
变量间接地引用myClass2
实例;通过将obj2
设置为obj2
,您就破坏了它。