美文网首页Swift一步步学习
Swift学习之内存管理

Swift学习之内存管理

作者: coderhlt | 来源:发表于2020-01-13 13:58 被阅读0次

一、引用管理

和OC一样,Swift也是采取基于引用计数的ARC内存管理

var s:Student? = Student()

weak  var s1:Student? = Student()
  • 强引用:默认情况下都是强引用
  • 弱引用:通过关键字weak修饰
class Student {
    var age:Int = 0
}
unowned var s2:Student? = Student()
print(s2?.age)
  • 无主引用: 通过unowned修饰。不会产生强引用,实例销毁后仍然存储着实例的内存地址。试图在实例销毁后访问无主引用,会产生运行时错误。

Fatal error: Attempted to read an unowned reference but object 0x100600660 was already deallocated

二、循环引用

2.1

class Student {
    var p0:Person?
     deinit {
             print("销毁 ")
    }
}

class Person {
    var s0:Student?
    deinit {
           print("销毁 ")
       }
}
var s:Student? = Student()
var p:Person? = Person()

s?.p0 = p
p?.s0 = s

p = nil
s = nil

Person和Student都不会销毁,虽然指向Person对象的p强指针和指向Student对象的s强指针不再引用对象了,但是Person对象的属性s0指针强引用着Student对象,Student对象的属性
p0指针强引用着Person对象,这样就产生了相互引用

class Student {
   weak var p0:Person?
     deinit {
             print("销毁 ")
    }
}

想要打破相互引用的局面,对属性指针置弱就可以了。p0 用weak修饰,也就意味着p = nil ,Person对象没有被任何强指针引用,就会销毁,自然Student对象也就销毁了。

2.2、闭包的循环引用

class Person {
    var fn:(() -> ())? //闭包作为存储属性,声明格式:(函数类型)?
    var fn1:((Int) ->(Int))?
    func run() {
        print("run")
    }
    deinit {
        print("deinit")
    }
}
func test (){
    let p = Person()
    p.fn = {
        p.run()
    }
}
test()
  • 闭包表达式默认会对用的外层对象产生额外的强引用(对外层对象进行了retain操作),导致对象p无法销毁。
p.fn = {
    [weak p] in
    p?.run()
}

   p.fn = {
        [unowned p] in
        p.run()
    }
  • 在闭包表达式的捕获列表声明weak或unowed引用,解决循环引用问题。
  • weak、unowned都能解决循环引用的问题,unowned要比weak少一些性能消耗。
  • 在生命周期中可能会变为nil的使用weak
  • 初始化赋值后再也不会变为nil的使用unowned
class Person{
 lazy   var fn:(() -> ()) = {[weak self] in self?.run()}
func run(){print(“run”)}
deinit{print(“deinit")}
  • 左边的闭包fn内部如果用到了实例成员(属性、方法)
  • 编译器会强制要求明确写出self
class Person{
  var age: Int = 0
lazy var getAge:Int = {
      self.age
}()

如果lazy属性是闭包调用的结果,那么不用考虑循环引用的问题(因为闭包调用后,闭包的生命周期就结束了 )

相关文章

  • Swift引用计数管理一

    Swift源码之引用计数管理一 标识Object-C或者Swift的内存管理标志类typedef unsigned...

  • Swift 内存管理

    简介 不管什么语言,内存管理始终是重中之重,所以作为苹果推荐使用的后起之秀Swift也不例外,Swift的内存管理...

  • 每天学一点Swift----面向对象下(十)

    十九. Swift内存管理 1. Swift提供了强大的内存管理机制:Swift通过自动引用计数(ARC)可以很好...

  • Swift--内存管理

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

  • swift内存管理

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Swift使用自动引用计数

    Swift使用自动引用计数(ARC)机制来处理内存。通常情况下,Swift内存管理机制会自动管理内存,无须我们考虑...

  • Swift 内存管理

    Swift 内存管理 [TOC] 前言 本文将介绍一下Swift中的内存管理,关于内存的一些基础知识可以参考我以前...

  • Swift底层原理-内存管理

    Swift底层原理-内存管理 Swift语言延续了和Objective-C语言一样的思路进行内存管理,都是采用引用...

  • Swift-内存管理,指针

    内存管理 Swift采用引用计数的ARC内存管理方案(堆空间) Swift的ARC中有3钟引用强引用弱引用(wea...

  • RxSwift学习之十七 (内存管理,循环引用问题

    @[TOC](RxSwift学习之十七 (内存管理,循环引用问题)) 1. Rxswift内存管理简介 Rxswi...

网友评论

    本文标题:Swift学习之内存管理

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