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

里面