快速无主的安全

Posted

技术标签:

【中文标题】快速无主的安全【英文标题】:Safety of unowned in swift 【发布时间】:2016-04-28 13:02:37 【问题描述】:

我从apple docs 阅读了有关unowned 的信息。

与弱引用一样,无主引用不会保持强保持 在它所指的实例上。然而,与弱引用不同的是, 假定无主引用始终具有值。因为这, 无主引用总是被定义为非可选类型。

所以看起来 unowned 类似于 weak 但它们是非可选的。

我想知道如果释放引用的 unowned 会发生什么。为什么没有像选项这样的检查。

我的意思是我可以做这样的事情,

class Customer 
    let name: String
    var card: CreditCard?
    init(name: String) 
        self.name = name
    
    deinit  print("\(name) is being deinitialized") 


class CreditCard 
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) 
        self.number = number
        self.customer = customer
    
    deinit  print("Card #\(number) is being deinitialized") 


var card: CreditCard? = nil
do 
    var john: Customer
    john = Customer(name: "John Appleseed")
    john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)
    card = john.card


print("Card belongs to \(card?.customer.name)")

在最后一行假设 unowned 总是有一个值尝试打印持卡人的姓名,我得到一个“执行被中断,原因:EXE_BREAKPOINT...”

我想不应该有这样的问题,或者应该在card = john.card行进行某种安全检查

【问题讨论】:

Are Unowned references set to 'nil' when deinitialized?的可能重复 【参考方案1】:

unowned 的检查版本已经存在 - 它被称为weak。这是主要区别。 unowned 是不安全的,但在某些情况下它可以使您的代码更清晰。

【讨论】:

Unowned 是不安全的,因为它可能会使您的程序崩溃,但崩溃行为是明确定义的。例如,Unowned 不会导致您访问悬空引用。【参考方案2】:

unowned 引用对于打破引用循环很有用,作为weak 的替代方法,当(正如您引用的 Apple Docs 所说)“您知道,一旦在初始化期间设置引用将永远不会为零。”

但是,您已经编造了一个示例,将 unowned 引用设置为对象,然后超出范围使 unowned 引用为零。

【讨论】:

以上是关于快速无主的安全的主要内容,如果未能解决你的问题,请参考以下文章

《数据安全法》:数据产业变革的开始

raft算法浅析

网络安全网站漏洞挖掘思路

安全框架快速了解安全框架

Java笔记-快速失败and安全失败

快速入门系列--WCF--07传输安全授权与审核