美文网首页次频道
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、留补...

    相关文章

      网友评论

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

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