美文网首页
内存管理

内存管理

作者: MissSunRise | 来源:发表于2021-09-01 11:48 被阅读0次

跟OC一样,Swift也是采取基于引用计数的ARC内存管理方案(针对对空间)

Swift的ARC中有3种引用
强引用:默认情况下,引用都是强引用

弱引用:通过weak定义弱引用
必须是可选类型的var,因为实例销毁后,ARC会自动将弱引用设置为nil
ARC自动给弱应用设置nil时,不会触发属性观察器

无主引用:通过unowned定义无主引用
不会产生强引用,实例销毁后仍然存储着实例的内存地址
试图在实例销毁后访问无主引用,会产生运行时错误(野指针)

weak、unowned的使用限制
weak、unowned只能用在类实例上面

protocol Livable AnyObject{).png

因为只有类实例才能被赋值nil

Autoreleasepool

pub lic func autoreleasepooleResulta ( invoking body () throus• Result) rethrows• Resolt.png

循环引用(Reference Cycle)

weak、unowned 都能解决循环引用的问题,unowned要比weak少一些性能消耗
在生命周期中可能会变为nil的使用weak
初始化赋值也不会变为nil的使用unowned

闭包的循环引用

闭包表达式默认会对用到的外层对象产生额外的强引用(对外层对象进行了retain操作)

下面代码会产生循环引用,导致Person对象无法释放(看不到Person的deinit被调用)

pub lic func autoreleasepooleResulta ( invoking body () throus• Result) rethrows• Resolt.png

没有打印 “deinit”

在闭包表达式的捕获列表声明weak或unowned引用,解决循环引用问题

• class Person.png class Person.png

闭包的循环引用

如果想在定义闭包属性的同时引用self,这个闭包必须是lazy的(因为在实例初始化完毕之后才能引用self)

class Person.png class Person.png

左边的闭包fn内部如果用到了实例成员(属性、方法)
编译器会强制要求明确写出self

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

class Person {.png

相当于一个方法去获取值

方法结束后引用关系都结束了

@escaping

非逃逸闭包、逃逸闭包,一般都是当做参数传递参数
非逃逸闭包:闭包调用发生在函数结束前,闭包调用在函数作用域内(很安全,self 释放之前)
逃逸闭包:闭包有可能在函数结束后调用, 闭包调用逃离了函数的作用域, 需要通过@escaping声明

eoort.png class Person.png

非逃逸闭包

如果有逃逸闭包,闭包没有被调用,所被引用的对象也不会被释放。要等逃逸闭包被调用后释放。如果想让对象释放逃逸闭包,要加weak

func run().png

相关文章

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • 11-AutoreleasePool实现原理上

    我们都知道iOS的内存管理分为手动内存管理(MRC)和自动内存管理(ARC),但是不管是手动内存管理还是自动内存管...

网友评论

      本文标题:内存管理

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