__unsafe_unretained的使用

我们一般很少用到__unsafe_unretained修饰词。但是在开源项目就会见到。

在介绍这个__unsafe_unretained之前,我们先来介绍下__weak。
__weak 表示的是对象的弱引用关系,__weak修饰的对象被释放后,指向对象的指针会自动置为空,也就是指向nil。
__unsafe_unretained表示的是弱引用关系,__unsafe_unretained修饰的对象被释放后,指针不会置为空,变成一个野指针,如果后续再访问这个对象就会crash。

那为什么有__weak还要用__unsafe_unretained呢?

使用__weak会消耗一定的性能,因为在用__weak修饰的对象是否被释放,在检查的时候需要一些信息。它相对应的有一个weak表。这个时候需要查找并置为nil。

而__unsafe_unretained不需要这么做。

什么时候用__unsafe_unretained?

例如:当对象A拥有对象B,A销毁B野销毁。这样点那个B存在,A也一定存在的时候,此时B要调用A的接口,就可以通过__unsafe_unretained 保持对A的引用关系。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐