我正在学习更多关于 Swift的知识并且最近遇到了延迟声明,这对我来说似乎很有趣.但是我真的不明白它的目的.来自C我将使用释放函数实现相同的功能,事实上,由于Swift是ARC,它可以做同样
假设FooData和BarData都使用需要解除分配的数据.
class FooData { deinit { print("FooData being deallocated") } } class BarData { } func baz() -> Int { var a = FooData() var b = BarData() defer { print("BarData being deallocated") } /* sensitive operations that could throw at any time */ return 0 } baz() // BarData being deallocated // FooData being deallocated
那么推迟方法优于deinit方法的优势是什么?考虑到除了资源清理之外的任何事情都要使用延迟会让我受伤…
你看到的是不同的,但没有,推迟由Apple引入作为一种安全简便的方法来处理返回前的清理,但推迟仅适用于范围.所以让我更好地解释一下,如果你在函数中定义了一些范围,你创建的变量只存在于你无法从deinit访问的范围内,例如:func resizeImage(url: NSURL) -> UIImage? { // ... let dataSize: Int = ... let destData = UnsafeMutablePointer<UInt8>.alloc(dataSize) defer { destData.dealloc(dataSize) } var destBuffer = vImage_Buffer(data: destData, ...) // scale the image from sourceBuffer to destBuffer var error = vImageScale_ARGB8888(&sourceBuffer, &destBuffer, ...) guard error == kvImageNoError else { return nil } // create a CGImage from the destBuffer guard let destCGImage = vImageCreateCGImageFromBuffer(&destBuffer, &format, ...) else { return nil } // ... }
在这种情况下,将变量destData定义为全局没有意义,我们需要在完成工作后解除分配,因此推迟选择.
我认为它可以用于更全局的范围,例如当您使用NSNotificationCenter或其他您需要的东西实现Key-Value Observer时.
我希望这对你有帮助.