我的myClass2中没有保留周期吗?

时间:2017-10-07 13:48:24

标签: swift retain-cycle

有人可以帮忙解释为什么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

1 个答案:

答案 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,您就破坏了它。