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
已经被释放,因为没有变量引用它。
假设我们有这段代码:
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
已经被释放,因为没有变量引用它。