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

Swift委托-何时在委托上使用弱指针

晏志明
2023-03-14
问题内容

有人可以解释何时以及何时不使用Swift中的委托指针进行“弱”分配,为什么?

我的理解是,如果您使用的协议未定义为类,则无法,也不想将您的委托指针分配给弱。

protocol MyStructProtocol{
    //whatever
}

struct MyStruct {
    var delegate: MyStructProtocol?
}

但是,当您的协议定义为类类型协议时,您是否要将委托设置为弱指针?

protocol MyClassProtocol: class{
    //whatever
}

class MyClass {
    weak var delegate: MyClassProtocol?
}

我对么?在Apple的快速指南中,类协议示例没有使用弱分配,但是在我的测试中,如果没有弱引用我的委托人,我会看到强参考周期。


问题答案:

通常,使类协议(如用class关键字定义)较弱,以避免“强参考周期”(以前称为“保留周期”)的风险。未能使代表人软弱,并不意味着您固有地拥有强大的参考周期,而仅仅是您
可以 拥有一个参考周期。

struct但是,对于类型,由于struct类型不是“引用”类型,因此大大降低了强引用循环的风险,因此很难创建强引用循环。但是,如果委托对象是类对象,那么您可能希望将协议设置为类协议并使其变弱。

我认为,使班级代表软弱只是部分缓解了强大的参考周期风险。这实际上是“所有权”的问题。大多数委托协议是在这样的情况下,所讨论的对象没有业务要求对委托人拥有所有权,而仅仅是在所讨论的对象提供告知某事(或请求某事)的能力。



 类似资料:
  • 主要内容:类委托,属性委托,标准委托,可观察属性 Observable,把属性储存在映射中,Not Null,局部委托属性,属性委托要求,翻译规则,提供委托委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口

  • 主要内容:声明委托,实例化委托,多播委托(合并委托)C# 中的委托(Delegate)类似于 C 或 C++ 中的函数指针,是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用。委托特别适用于实现事件和回调方法,所有的委托都派生自 System.Delegate 类。在实例化委托时,可以将委托的实例与具有相同返回值类型的方法相关联,这样就可以通过委托来调用方法。另外,使用委托还可以将方法作为参数传递给其他方法, 委托具有以下特点: 委托类似

  • 关于“行为委派”的良好讨论可以在 找到。

  • 委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 Kotlin 直接支持委托模式,更加优雅,简洁。Kotlin 通过关键字 by 实现委托。 类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。 以下实例中派生类 Derived 继承了接口 Base 所有方法,并且委托一个传入的 Base 类的

  • ILRuntime中使用委托 如果只在热更新的DLL项目中使用的委托,是不需要任何额外操作的,就跟在通常的C#里那样使用即可 如果你需要将委托实例传给ILRuntime外部使用,那则根据情况,你需要额外添加适配器或者转换器。 需要注意的是,一些编译器功能也会生成将委托传出给外部使用的代码,例如: Linq当中where xxxx == xxx,会需要将xxx == xxx这个作为lambda表达式

  • 问题内容: 我在Web应用程序中使用jQuery。在阅读其文档时,我了解了和。尽管他们解释了这两种方法,但我不了解它们之间的确切区别。也不确定哪种方法在哪种情况下是理想的。 请帮助我清楚地了解这些方法。 谢谢 问题答案: 要求您立即运行选择器,除非您使用的结果非常浪费。这里的事件处理程序是附加到的,因此必须检查所有冒泡的该类型事件。这是一个用法示例: 请注意, 即使我们不在乎 该语句,该选择符 也