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