美文网首页Swift
读书笔记: swift tips weak delegate

读书笔记: swift tips weak delegate

作者: 华落 | 来源:发表于2017-07-21 16:51 被阅读6次

关于delegate的使用

在ARC模式下,使用delegate的时候,为了避免循环引用,我们常常会采用weak delegate的方式,在weak属性被释放的时候,ARC会帮助我们将weak属性置为nil,大大降低了我们出错。
  而在swift中,如果我们用weak关键字来修饰delegate,是无法编译通过的:

import Foundation

protocol ExampleProtocol {
    
}
class WeakClass {
    weak var delegate : ExampleProtocol?
}
//error 'weak' may only be applied to class and class-bound protocol types

这是因为swift的中protocol并不仅限于class类型,而值类型(struct,enum)也可以实现协议,而值类型本身就不是通过引用计数来管理内存的,所有也不存在ARC的引用计数。

swift中weak delegate的使用

想要在swift中实现weak delegate我们可以有2种方法,第一种我们可以在protocol声明前加上@objc 关键字,这样可以将协议的遵守者,限定为class实例,本质是协议成了objc的协议,并且只能有NSObject的子类来实现。

import Foundation

@objc protocol ExampleProtocol {
    
}
class WeakClass {
    weak var delegate : ExampleProtocol?
}
//build succeeded

这是一种可以满足的需求的方案,还有一种更优雅的做法是将我们的delegate限定为class类型才可以实现:

import Foundation

//在协议名称后加上 : class
protocol ExampleProtocol : class {
    
}

class WeakClass {
    weak var delegate : ExampleProtocol?
}
//build succeeded

这是一种更加优雅,更加符合swift风格的方式,也可以避免与objc兼容性的问题。

本文是读书笔记,原文请点击DELEGATE

相关文章

  • 读书笔记: swift tips weak delegate

    关于delegate的使用 在ARC模式下,使用delegate的时候,为了避免循环引用,我们常常会采用weak ...

  • delegate

    Swift的delegate 用weak修改的时候的注意事项Swift-代理

  • Swift weak delegate

    需要使用delgate时,为了防止循环引用需要添加weak关键字,但是上面的代码XCode会报错。因为swift里...

  • Swift struct Mutable 的方法

    @(Swifter - 100 个 Swift 必备 Tips (第二版) 读书笔记)[swift][ios] 1...

  • ios 日常总结

    一 : Delegate weak/strong

  • weak delegate

    delegate委托模式是一种常用的设计模式 ,我们通常将声明为delegate属性指定为weak,在这个dele...

  • Swift的代理delegate

    在Swift实际开发中,很容易在声明delegate时忽略掉使用weak,这是一个比较严重的问题。现对delega...

  • IOS

    一、Delegate为什么要用weak或者assign修饰,不能用strong?说明:weak、assign修饰的...

  • iOS 关于 delegate 修饰词的错误认知

    不是所有的 delegate 都必须使用 weak 的,他是可以使用 strong 的 对于 delegate 很...

  • 修饰关键字的选择问题

    1.代理用nonatomic, weak修饰weak:指明该对象并不负责保持delegate这个对象,delega...

网友评论

    本文标题:读书笔记: swift tips weak delegate

    本文链接:https://www.haomeiwen.com/subject/sepekxtx.html