美文网首页次频道
iOS*内存管理-强引用与弱引用

iOS*内存管理-强引用与弱引用

作者: 前进的竹子 | 来源:发表于2017-05-17 14:18 被阅读406次

前言

OC中的内存管理是通过引用计数器来实现的。一个对象的声明周期取决于它是否还没其他对象引用-即retainCount是否等于0。
但在有些情况下,我们并不希望对象的销毁时间由是否被其他对象应用来决定,而是这个对象本该是什么时候销毁就什么时候被销毁。因此引入强引用和弱引用的概念。

概念

强引用:当前对象被其他对象引用时,会执行retain,引用计数+1.当retainCount=0时,该对象才会被销毁。 默认情况下是强引用方式。

弱引用:当前对象的声明周期不被是否由其他其他对象引用限制,它本该什么时候销毁就什么时候销毁。计时它的引用没断,但是当它的生存周期到了就会被销毁。

理解:当最后一个指向对象的的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除所有剩余的weak指针。

weak指针不持有对象,不影响对象的retainCount。

强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱引用会自动的指向nil。

声明

强引用:声明为retain类型,ARC后声明为strong类型。

弱引用:声明为assign类型,ARC后声明为weak类型。

retain和strong是一致的,声明强引用。

assign和weak基本一致。区别在于,weak严格的说是“归零弱引用”,当对象被销毁后,会自动把它的指针置为nil,防止野指针错误;而assign销毁对象后不会把该对象的指针置为nil,对象已经被销毁,但指针还指向这个对象,这个指针编程野指针。

理解

理解.jpeg

气球只有被牵着才不会飞走,牵气球的角色有两种:1、弱者-太弱,拉不动,只能在旁边看着,只能作为观察者和使用者,可以有多个。2、强者-拥有气球,负责掌握牵扯气球的线,可以有多个,并且每个都会独自拥有一条牵扯的线。

当所有的线都消失(被剪断)的情况下,气球就会飞走消失。

只有当所有的强者手中的线都间断的时候,才会导致气球消失,而这个时候是不论弱者有多少,都没有任何作用。而所有的弱者都消失时,只要有一个强者还在,那么气球就不会消失。

弱者-weak引用,强者-strong引用

弱引用解决的问题

1、强引用循环:A对象强引用了B对象,B对象也强引用了A。因为都是强引用,也就是无论是A是B都要在对方的引用断了后才能销毁,但要断了引用,就必须对方对象销毁。就会出现这种僵局,为了避免出现这种情况,就应该有一个对象“示弱”,使其为“弱引用”。

2、一些集合类不应该增加其元素的引用,这会引起对象无法释放。这种情况下,我们需要使用弱引用。

3、留补...

相关文章

  • Swift进阶 05:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用与Runtime等。 内存管理-强引用 ...

  • Swift进阶06:内存管理 & Runtime

    本文主要介绍Swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime等 内存管理 - 强引用...

  • iOS*内存管理-强引用与弱引用

    前言 OC中的内存管理是通过引用计数器来实现的。一个对象的声明周期取决于它是否还没其他对象引用-即retainCo...

  • Swift-05:内存管理

    swift中的内存管理,涉及引用计数、弱引用、强引用、循环引用、Runtime是什么样子的呢? 内存管理 - 强引...

  • iOS Runtime 数据结构

    ios内存布局 内存管理方案 数据结构 ARC & MRC 引用计数 弱引用 自动释放池 循环引用 ios内存布...

  • iOS ,内存分布、内存管理 、isa 指针,散列表(引用计数表

    iOS ,内存分布、内存管理 、isa 指针,散列表(引用计数表,弱引用表) 内存管理方案 1.taggedPoi...

  • Swift-内存管理,指针

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

  • iOS 内存管理--弱引用和强引用

    前言 前面我们已经学习了几篇iOS内存相关的内容,分别如下: iOS 内存管理--内存五大区、TiggedPoin...

  • Swift学习之内存管理

    一、引用管理 和OC一样,Swift也是采取基于引用计数的ARC内存管理 强引用:默认情况下都是强引用 弱引用:通...

  • java中的四种引用

    Java 中有四种引用:强引用、软引用、弱引用、虚引用。引用的存在,就是为了让开发者可以更好地管理内存。 1. 强...

网友评论

    本文标题:iOS*内存管理-强引用与弱引用

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