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

前言

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,对象已经被销毁,但指针还指向这个对象,这个指针编程野指针。

理解


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

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

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

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

弱引用解决的问题

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

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

3、留补...

猜你喜欢

转载自blog.csdn.net/fengzhixinfei/article/details/72381232