记录iOS中的循环引用

首先,循环引用是我们在进行开发的过程中,需要引起重视的问题。

因为代码中造成循环引用后,对象会被相互强关联,在对象需要被释放的时候无法进行释放,导致内存无法释放。

(cell最后持有了self,而它本身又在被self持有,我拿我自己?显然不合理)

所以解除循环引用就必要的需要

一般为我们所知的循环使用有以下:

1、闭包没有【weak self】或者 【unowned self】 ,会造成循环引用
2、使用计时器时,没有进行正确的销毁,也会导致循环引用
3、使用代理时没有进行相应的弱引用关键字

在最近的优化中,频频打开关闭页面后会导致内存上升且无法下降,我就认为某些地方导致了循环引用的出现,导致内存无法被正确的释放,在经过各种筛查后发现一个被忽视的隐藏循环引用的写法,特此记录一下

在使用闭包时,为了图省事直接将self的方法名直接对应到闭包中,此方法简单所以我以为Apple已经默认的添加了【weak self】在底层代码中,就一直没有进行相应的处理。

就是在这里我大意了,这样的写法虽然便捷,但是底层并没有帮我们添加关键字,所以一直是在以强引用的方式引用这闭包,所以该页面被关闭后就会一直还存在于内存当中没有进行释放。

错误写法

view.clickCycleCellBlock = clickAdvertisingCell

正确写法

view.clickCycleCellBlock = { [weak self] (row) in
            self?.clickAdvertisingCell(tag: row)
        }

在iOS开发中,有两个很关键的函数,init(在初始化时执行)和deinit(在被释放时执行),
所以要想检测到底有没有被释放,我们可以在deinit函数中打印日志来观察。

你可能感兴趣的:(记录iOS中的循环引用)