gpt4 book ai didi

memory-management - 'unowned(safe)' 和 'unowned(unsafe)' 之间的 Swift 有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 05:06:34 27 4
gpt4 key购买 nike

Apple 的 Swift Programming Language Guide除了 weak 之外,还提到了捕获说明符 unowned(safe)unowned(unsafe)无主

我(认为我)理解 weakunowned 之间的区别;但是 unowned(safe)unowned(unsafe) 有什么区别?指南没有说。


请:不要依赖于简单地声明一个 Objective-C 等价物。

最佳答案

据我了解,虽然我无法从 Apple 找到明确的来源,但 unowned 可以分为两种类型,safeunsafe.

unownedunowned(safe):它是一个特殊包装的引用,当引用已释放的实例时会抛出异常。

特殊情况是 unowned(unsafe):它是 Objective C 的 @property (assign)__unsafe_unretained 的 Swift 等价物。它不应该在 Swift 程序中使用,因为它的目的是桥接到用 Objective C 编写的代码。

因此,在查看 Cocoa 类的导入包装器时,您会看到 unowned(unsafe),但除非必须,否则不要使用它,您会知道何时必须使用它。


更新

__unsafe_unretained 是一个简单的指针。它不知道所指向的实例何时被释放,因此当它被取消引用时,底层内存可能是垃圾。

如果您在使用已释放的 __unsafe_unretained 变量时遇到缺陷,您将看到不稳定的行为。有时该内存位置足够好,因此代码可以运行,有时它会被部分覆盖,因此您会遇到非常奇怪的崩溃,有时该内存位置将包含一个新对象,因此您会遇到无法识别的选择器异常。

Transitioning to ARC Release Notes

__unsafe_unretained specifies a reference that does not keep the referenced object alive and is not set to nil when there are no strong references to the object. If the object it references is deallocated, the pointer is left dangling.

关于memory-management - 'unowned(safe)' 和 'unowned(unsafe)' 之间的 Swift 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26553924/

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