gpt4 book ai didi

swift - 在 Swift 中使用 deinit 和 defer 进行资源释放的区别

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:12 24 4
gpt4 key购买 nike

我正在学习更多关于 Swift 的知识,最近遇到了 defer 语句,这对我来说似乎很有趣。但是我真的不明白它的目的。来自 C++,我会使用释放函数实现相同的功能,事实上,由于 Swift 是 ARC,它可以做同样的事情。

假设 FooDataBarData 都处理需要释放的数据。

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

那么 defer 方法相对于 deinit 方法有什么优势呢?一想到将 defer 用于除资源清理之外的任何事情,我就头疼...

最佳答案

你看到的是不同的,但实际上并没有,defer 是 Apple 引入的一种安全且简单的方法来处理返回前的清理,但 defer 只有效对于范围。因此,让我更好地解释一下,如果您在函数内部定义了一些范围,并且您创建的变量仅存在于您无法从 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 定义为全局变量是没有意义的,我们需要在完成对它的使用后释放它,所以选择 defer .

我认为 deinit 它可以用于更大的全局范围,例如,当您使用 NSNotificationCenter 或您需要的其他东西实现 Key-Value Observer 时。

希望对您有所帮助。

关于swift - 在 Swift 中使用 deinit 和 defer 进行资源释放的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38208168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com