欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS 常见的循环引用总结

程序员文章站 2024-02-14 16:44:16
ios 常见的循环引用总结 介绍: 循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。 举个例子:a-&...

ios 常见的循环引用总结

介绍:

循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存。其实有点类似死锁。

举个例子:a->b->c->....->x->b   ->表示强引用,这样的b的引用计数就是2,假如a被系统释放了,理论上a会自动减小a所引用的资源,就是b,那么这时候b的引用计数就变成了1,所有b无法被释放,然而a已经被释放了,所有b的内存部分就肯定无法再释放再重新利用这部分内存空间了,导致内存泄漏。

情况一:delegate

delegate是ios中开发中最常遇到的循环引用,一般在声明delegate的时候都要使用弱引用weak或者assign

@property (nonatomic, weak, nullable) id <uitableviewdelegate> delegate;

当然怎么选择使用assign还是weak,mrc的话只能用assign,在arc的情况下最好使用weak,因为weak修饰的变量在是否后自动为指向nil,防止不安全的野指针存在

情况二:block

block也是比较常见的循环引用问题,在block中使用了self容易出现循环引用,因此很多人在使用block的时候,加入里面有用到self的操作都会声明一个__weak来修饰self。其实便不是这样的,不是所有使用了block都会出现self循环引用问题,只有self拥有block的强引用才会出现这种情况。

所以一般在函数中临时使用block是不会出现循环应用的,因为这时候block引用是属于栈的。当栈上的block释放后,block中对self的引用计数也会减掉

当然不一定要self对block有直接的引用才会出现,假如self的变量b,b中有个block变量,就容易出现这种情况,好的是在block出现循环引用的,xcode7会出现警告提示(之前版本不确定)。

情况三:nstimer

这是一个神奇的nstimer,当你创建使用nstimer的时候,nstimer会默认对当前self有个强引用,所有在self使用完成打算是否的时候,一定要先使用nstimer的invalidate来停止是否时间控制对self的引用

[_timer invalidate];

总结:

上面说的是我们常见的,其实循环引用就是说我们的强引用形成了闭环,还会有很多自己写的代码中会出现,平时还是要注意写法。当然xcode的instruments也能帮助到大家排除一些这样类似的内存问题。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!