iOS-日常总结

iOS之__unsafe_unretained

2019-12-05  本文已影响0人  枫叶无处漂泊

前言

在学习的过程,难免会用一些开源库,想要提升自己的能力,避免不了阅读和学习优秀的开源库源码,就发现一些开源库的源码中有用到__unsafe_unretained。__unsafe_unretained有什么含义,使用它有什么好处和作用。

__unsafe_unretained是什么

看到这里大家应该能想到和这个相似的__weak:

__unsafe_unretained什么时候使用,为什么使用

刚说了和__weak区别,发现这个__unsafe_unretained 使用不好的话,容易产生野指针,从而抛出BAD_ACCESS的异常引发崩溃。

这个家伙使用不好容易引发崩溃,并且有__weak干嘛还使用它呢?

综上原因就是,__unsafe_unretained比__weak快,消耗cpu资源也比__weak少。

既然__unsafe_unretained容易引发野指针,那么什么时候使用它,怎么能使用好它呢。

怎么使用__unsafe_unretained

当你明确对象的生命周期的时候,可以使用__unsafe_unretained替代__weak,可以稍微提高一些性能,虽然这点性能微乎其微。但是项目中有越来越多的对象可以让你使用的__unsafe_unretained,积少成多。还是有一定提高性能作用的。

举个例子,当A拥有B对象,A消亡B也消亡,这样当B存在,A也一定会存在的时候,此时B要调用A的接口,如果不使用弱引用,就会引发循环引用造成内存泄漏,就可以通过__unsafe_unretained(我经常使用weak)保持对A的弱引用关系。

最后上一段代码来看看weak与__unsafe_unretained区别

 __weak UIView *view = [UIView new];
 //view此时是nil,nil调用法不会引发崩溃
 view.backgroundColor = [UIColor redColor];
 NSLog(@"objc --- %@",view);

打印结果

objc --- (null)

此时要是__weak改成__unsafe_unretained

 __unsafe_unretained UIView *view = [UIView new]; 
 //调用方法会引发崩溃,该对象已经内存释放了变成野指针
 view.backgroundColor = [UIColor redColor];
 NSLog(@"objc --- %@",view);

结尾

上一篇 下一篇

猜你喜欢

热点阅读