将创建的变量传递给闭包是否安全?

时间:2017-11-13 10:23:41

标签: swift

每个人都知道保留周期的标准情况。

class TestClass {

    var aBlock: (() -> ())? = nil

    let aConstant = 5


    init() {
        print("init")
        aBlock = {
            print(self.aConstant)
        }
    }

    deinit {
        print("deinit")
    }


}

var testClass: TestClass? = TestClass()
testClass = nil

但是这样的情况如何:

class A {

    let b: B
    let c: C

    init() {
        b = B()
        c = C()
    }

    func foo() {
        let localC = c
        b.bar {
            localC.execute()
        }
    }
}

BC是类。

我复制了c并将b.bar封锁作为localC传递给了<?xml version="1.0" encoding="utf-8" standalone="no"?> <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30"> <InstrumentationKey>...</InstrumentationKey> <TelemetryInitializers> <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationIdTelemetryInitializer"/> <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebOperationNameTelemetryInitializer"/> <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebSessionTelemetryInitializer"/> <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserTelemetryInitializer"/> <Add type="com.microsoft.applicationinsights.web.extensibility.initializers.WebUserAgentTelemetryInitializer"/> <Add type="com.microsoft.applicationinsights.extensibility.initializer.docker.DockerContextInitializer"/> </TelemetryInitializers> <TelemetryModules> <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule"/> <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebSessionTrackingTelemetryModule"/> <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebUserTrackingTelemetryModule"/> </TelemetryModules> </ApplicationInsights> 。在我看来,这种情况不会产生保留周期,并且A的重新分配不会出现问题。

但我不是百分百肯定,我想问一些有更多经验的人。有人可以解释一下引用会发生什么吗? TNX。

1 个答案:

答案 0 :(得分:1)

您设置它的方式不应该创建任何保留周期。

localC是不必要的。所做的只是创建对c的基础实例的另一个引用。它们完全相同。修改localC也会修改c。他们指向同一个对象。您必须明确copy()才能指向不同的对象。

考虑到这一点,这是参考图表:

references

如您所见,没有创建保留周期。