Swift 忽略 return 值的范围?
Swift scope of ignored return value?
我有类似下面的功能
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
}
但是,当 return 值被忽略时会发生什么,它会立即超出范围吗?
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 不是用来检查内存相关代码的。参考 this.
如果你不相信我,就在实际项目中检查你的代码。我确实做到了。
栏:
class Bar {
deinit {
print("Do some cleanup")
}
class func foo() -> Bar {
return Bar()
}
}
ViewController:
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
里面
我有类似下面的功能
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
}
但是,当 return 值被忽略时会发生什么,它会立即超出范围吗?
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 不是用来检查内存相关代码的。参考 this.
如果你不相信我,就在实际项目中检查你的代码。我确实做到了。
栏:
class Bar {
deinit {
print("Do some cleanup")
}
class func foo() -> Bar {
return Bar()
}
}
ViewController:
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