美文网首页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

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