当前位置: 首页 > 面试题库 >

弱引用和非引用之间有什么区别?

姜锋
2023-03-14
问题内容

斯威夫特有:

  • 强引用
  • 参考文献薄弱
  • 无人参考

无主引用与弱引用有何不同?

什么时候可以使用无主引用安全?

无主引用是否像C / C
++中的悬空指针一样具有安全风险?


问题答案:

双方weakunowned引用不创建一个strong被引用的对象上保持(又名它们不会取消分配引用的对象增加,为了保留计数,以防止电弧)。

但是为什么要两个关键词呢?这种区别与Optional类型内置在Swift语言中这一事实有关。长话短说:可选类型提供了内存安全性(这与Swift的构造函数规则完美结合-
为了提供这种好处而严格)。

一个weak参考允许它可能成为nil(这个自动引用对象被释放情况),因此你的财产的类型必须是可选的-
所以你,作为一个程序员,有义务使用它(基本上是前检查编译器会尽力迫使您编写安全的代码)。

一个unowned参考假定它永远不会成为nil其生命周期内。在初始化期间必须设置一个无主引用-
这意味着该引用将被html" target="_blank">定义为一种非可选类型,无需检查即可安全使用。如果以某种方式释放了要引用的对象,则当使用无主引用时,应用程序将崩溃。

从Apple文档:

只要有效的引用在其生存期内的某个时候变为零就使用弱引用。相反,当您知道一旦在初始化期间将其设置为零,便可以使用无主引用。

在文档中,有一些示例讨论了保留周期以及如何打破它们。所有这些示例均摘自docs。

weak关键字示例:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    weak var tenant: Person?
}

现在,对于一些ASCII艺术(您应该去看一下文档
-它们有漂亮的图表):

Person ===(strong)==> Apartment
Person <==(weak)===== Apartment

PersonApartment实施例显示的情况下两个属性,这两者都允许是零,有可能引起强烈的基准周期的潜力。用弱引用可以最好地解决此情况。两个实体都可以存在而不必严格依赖另一个实体。

unowned关键字示例:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) { self.name = name }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) { self.number = number; self.customer = customer }
}

在此示例中,a Customer可能具有或可能不具有CreditCard,但a CreditCard 将始终
与关联Customer。为了表示这一点,Customer该类具有可选card属性,但是CreditCard该类具有非可选(且没有customer所有权)属性。

Customer ===(strong)==> CreditCard
Customer <==(unowned)== CreditCard

CustomerCreditCard实施例示出了其中被允许是nil一个属性并且不能是零另一个属性具有引起很强的参考周期的电势的情况。最好使用无主引用来解决此情况。

苹果的注意事项:

弱引用必须声明为变量,以指示其值可以在运行时更改。弱引用不能声明为常量。

还有第三种情况,即两个属性都应始终具有值,并且初始化完成后,两个属性都不应为零。

此外,在使用闭包时,还可以避免经典的保留周期方案。

为此,我鼓励您访问Apple文档或阅读本书。



 类似资料:
  • 和有什么区别?他们彼此有关系吗?或者它们只是并发实现? 是否有人与他们一起工作,并能给出/解释两者的利弊? 使用我指的是ng-bootstrap.github和 与我的意思是valor-software-ngx-bootstrap。 两者都与Angular 4有关(不是AngularJS!)和引导4。 请注意,这不是一个重复的问题ngx-bootstrap和ng2 bootstrap之间的区别?。

  • 问题内容: 我有以下功能 这段代码: 我的问题可能有点难以理解,所以请忍受:是什么使该代码段与常规调用完全区分开,或者是什么使该代码段需要引用函数变量而不是常规调用?() 我怎么知道应该在哪里引用该函数,以及什么时候该真正调用它? 问题答案: 好吧,该属性期望对函数的引用,以便在单击元素时执行该函数。通常是: 要么 (但是,当然,最好使用和) 请注意,它们都是如何引用函数而不是调用。 当某些东西需

  • 变量、对象和引用之间到底有什么区别? 例如:它们都指向某种类型,并且它们都必须保存值(当然,除非您有临时的可null类型),但是它们的功能和实现之间有何不同? 例子: 它们有相同的概念,但又有什么不同呢?

  • 问题内容: 我的Java书解释说,要使用对象,我们可以将它们分配给引用变量。这与指向对象的指针有何不同?Java有指针吗? 谢谢 :) 问题答案: 引用有点像指针,您不能对其进行算术……尽管它更不透明。尽管基础位 可能 是虚拟内存中的地址,但不一定必须如此。它们只是获取对象(或表示null值)的一种方式。因此,尽管它们并不完全相同,但如果您习惯于将指针视为“一种识别对象或导航至该对象的方式”(在某

  • 问题内容: 这是过去的考试问题,我想知道什么是原始类型和引用类型?对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型是仅使用int或字符串创建数组的类型。(对?) 您认为您会如何回答测试中的问题并获得良好的信誉?如果没有真正直接引用原始的ARRAY类型,有没有办法做到这一点?还是您只用数组解释一下就可以了。 问题答案: 这些是Java中的原始类型: boolean byte short

  • 问题内容: java中的按引用传递和按引用调用有什么区别? 问题答案: Java不会通过引用传递任何变量。 考虑使用Java中的引用传递对象是很诱人的,但是很有害。对象类型的变量是引用。传递时,它们按值传递。 在其他语言中,按引用传递和按引用调用是同一回事。 编辑: 现有的stackoverflow问题“Java是否通过引用传递?”中提供了更多详细信息。(剧透:没有)