我有一个类似下面的函数
class Bar {
deinit {
print("Do some cleanup")
}
}
func foo() -> Bar {
return Bar()
}
Bar
的范围在这样调用时很清楚:
func useFoo() {
let bar = foo()
runFunctionA()
// bar goes out of scope: "Do some cleanup" is printed
}
但是,当返回值被忽略时会发生什么,它会立即超出范围吗?
func useFoo() {
let _ = foo()
// "Do some cleanup" is printed here?
runFunctionA()
// "Do some cleanup" is printed here?
}
此外,使用 let _ = foo()
还是仅使用 _ = foo()
会有区别吗?
最佳答案
在第二种情况下,没有人获得返回对象的所有权,因此 ARC 立即释放该对象。因此,在 runFunctionA()
调用之前,您必须看到 Do some cleanup
。
此外,let _ = foo()
类似于 _ = foo
现在,当您必须在 playground 上查看不同的结果时,您一定在想我在写什么废话。
问题是,playgrounds 不是用来检查内存相关代码的。引用this .
如果您不相信我,请在实际项目中检查您的代码。我确实做到了。
栏:
class Bar {
deinit {
print("Do some cleanup")
}
class func foo() -> Bar {
return Bar()
}
}
View Controller :
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
useFoo()
useFooAgain()
}
func useFoo() {
let bar = Bar.foo()
print("inside useFoo")
}
func useFooAgain() {
let _ = Bar.foo()
print("inside useFooAgain")
}
}
输出:
在 useFoo 中
做一些清理工作
做一些清理工作
在 useFooAgain 里面
关于忽略返回值的Swift范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47451326/