__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的引用关系。