我正在学习更多关于
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
解决方法
你看到的是不同的,但没有,推迟由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时.
我希望这对你有帮助.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。