美文网首页Swift开发iOS开发iOS学习笔记
Swift学习_闭包引起的循环强引用

Swift学习_闭包引起的循环强引用

作者: CN_HarrySun | 来源:发表于2017-07-24 16:01 被阅读19次
Swift

除了类的实例之间会产生循环强引用之外,在闭包和类之间也可能产生强引用。这种强引用出现在将闭包赋值给类的属性,同时在闭包内部引用了这个类的实例时。究其原因,是因为闭包也是引用类型,当在闭包内部引用类的实例属性和方法时,闭包默认对类的实例拥有强引用。要解决这个问题,需要使用闭包捕获对象。

下面这个例子是一个实例和闭包相互之间的强引用
class Student{
    
    var name:String?
    var score:Int
    lazy var level:(Void) -> String = {
        
        switch self.score{
            
        case 0..<60:
            return "C"
        case 60..<85:
            return "B"
        case 85..<100:
            return "A"
        default:
            return "D"
        }
    }
    
    init(name:String,score:Int){
        
        self.name = name
        self.score = score
    }
    
    deinit {
        print("Student 对象:\(name!)被销毁了")
    }
}

var xiaoMing:Student? = Student(name:"小明",score:86)
print("\(xiaoMing!.name!)成绩水平为:\(xiaoMing!.level())")
xiaoMing = nil
// 当实例被赋予nil时,没有调用析构函数

解决这个问题我们使用捕获列表
[weak self,unowned delegate = self.delegate]
[unowned self, weak delegate = self.delegate!]

下面重新写一个
class Student2{
    
    var name:String?
    var score:Int
    
    lazy var level:(Void) -> String = {
        
        [weak self] in
        switch self!.score{
            
        case 0..<60:
            return "C"
        case 60..<85:
            return "B"
        case 85..<100:
            return "A"
        default:
            return "D"
        }
    }
    
    init(name:String,score:Int){
        
        self.name = name
        self.score = score
    }
    
    deinit {
        print("Student对象:\(name!)被销毁了")
    }
}

var xiaoMing2:Student2? = Student2(name:"小明",score:86)
print("\(xiaoMing2!.name!)成绩水平为:\(xiaoMing2!.level())")
xiaoMing2 = nil

通过[weak self] in 在闭包前增加了捕获列表的定义。并且由于self可能为nil,因为是weak的弱引用,因此需要叹号解包self使用,


闭包引起的循环强引用结果输出
代码已上传至git:
--> 传送门:Swift_基本语法

附录

查看完整专栏《Swift学习》

有问题欢迎指正以及相互探讨 —— CoderSun

相关文章

  • Swift--内存管理

    Swift内存管理概述 强引用循环 打破强引用循环 闭包中的强引用循环 Swift内存管理概述 Swift中的AR...

  • Swift语法--12-3闭包的循环引用

    Swift语法--12-3闭包的循环引用 闭包循环引用产生条件 如果在HttpTool中有对闭包进行强引用,则会形...

  • Swift学习_闭包引起的循环强引用

    除了类的实例之间会产生循环强引用之外,在闭包和类之间也可能产生强引用。这种强引用出现在将闭包赋值给类的属性,同时在...

  • Swift入门二(对象函数)

    函数 闭包 GCD 尾随闭包 闭包循环引用解决(OC) 闭包循环引用解决(swift推荐) 面向对象 命名空间: ...

  • swift重温笔记(自动引用计数)

    自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 ...

  • swift语法02

    Swift面向对象 01-闭包的循环引用 循环引用形成条件闭包中访问了self或者self的属性/方法必须有一个强...

  • Day2

    1 单方向的引用不会产生循环引用。循环引用:闭包引用了self,self引用了闭包。Swift推荐使用解决循环引用...

  • Swift Tour Learn (九) -- Swift 语法

    本章将会介绍 自动引用计数的工作机制自动引用计数实践类实例之间的循环强引用解决实例之间的循环强引用闭包引起的循环强...

  • Swift解决【闭包引起的循环强引用】

    循环强引用还会发生在当你将一个闭包赋值给类实例的某个属性,并且这个闭包体中又使用了这个类实例时。这个闭包体中可能访...

  • 2019-12-04

    swift 闭包循环引用产生以及处理

网友评论

    本文标题:Swift学习_闭包引起的循环强引用

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