Swift 中返回的对象和 ARC

Returned objects and ARC in Swift

假设我们有这段代码:

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

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

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

因此 getSomeString() 中的 str 将在调用 anotherMethod() 之后被释放。我对吗?如果不是,那么这将如何发生?

在你的例子中,不会发生释放,因为 String 是一个值类型。值类型不受 ARC 的影响。你甚至不能引用它们。它们只是价值观。

虽然String是一个值类型,但是它包装了一个引用类型来存储。但是,由于我们无法覆盖包装类型的析构器,我将使用此代码来演示当您 return 引用类型时会发生什么:

// 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")

在控制台中,"deallocated" 打印在 "returned" 之前。这意味着当 anotherMethod 已经 returned 时,obj 已经被释放,因为没有变量引用它。