IOS常见的循环引用总结

  

<强> IOS常见的循环引用总结

  

<强>介绍:

  

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

  

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

  

<强>情况一:委托

  

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

        @ property(原子,弱,可空)id & lt; UITableViewDelegate>委托;      

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

  

<强>情况二:块

  

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

  

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

  

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

  

<强>情况三:NSTimer

  

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

        [_timer无效];      

<强>总结:

  

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

  

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

IOS常见的循环引用总结