在 Swift 中返回对象和 ARC



假设我们有这样的代码:

func getSomeString() -> String {
    let str = "Some string"
    print(str)
    return str
}

所以我想知道这个str什么时候会被 ARC 解除分配?我认为这取决于我们从这个函数获取它后如何处理这个对象。例如,我们有这种方法:

func anotherMethod() {
   let anotherStr = getSomeString()
}

因此,在调用anotherMethod()后,将从getSomeString()中释放str。我说的对吗?如果没有,那么这将如何发生?

在您的情况下,不会发生释放,因为String是一种值类型。值类型不受 ARC 的影响。您甚至无法引用它们。它们只是价值观。

尽管String是值类型,但它包装了用于存储的引用类型。但是,由于我们无法重写包装类型的取消初始值设定项,因此我将使用此代码来演示返回引用类型时会发生什么情况:

// class is a reference type!
class MyClass {
    deinit {
        print("deallocated")
    }
}
func getSomeObject() -> MyClass {
    let obj = MyClass()
    return obj
}
func anotherMethod() {
    let anotherObj = getSomeObject()
}
anotherMethod()
print("returned")

在控制台中,"已解除分配"在"返回"之前打印。这意味着当anotherMethod返回时,obj已被释放,因为没有变量引用它。

最新更新