【Tips】如何在UIView中释放监听

语言: CN / TW / HK

点击关注“八戒技术团队”,阅读更多技术干货

今天和大家分享一个50%以上的ios程序员都不知道的知识点!

真的吗?不过50%是怎么计算来的呀?

因为我咨询过5个搞ios研发的同事,没一人知道!哈哈哈哈哈!

在代码编写中,我们使用通知的都知道,通知要先在VC中设置监听,用方法:

[[NSNotificationCenter defaultCenter]addObserver:selector:name:object],

当VC释放时必须得释放这个监听,不然就会有内存泄露的风险,使用释放方法:

[[NSNotificationCenter defaultCenter]removeObserver:]。

现在就来说说释放的问题,大部分知道应该释放的猿们,释放的地点应该都是在dealloc里使用,代码如下:

- (void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}  

这种写法在VC里面,是没有问题的。

问题是,如果在UIView里也这样写,UIView里的dealloc方法会不会被调用取决于UIView所在的VC有没有调用dealloc。如果VC没释放,那么UIView也不会被释放,因此监听者就不会被释放掉,内存就此产生泄露。

有图有真相,请往下看。

以上是在一个UIView里增加了2个监听。

然后在dealloc方法里移除监听。

在展示这个视图之前,memory占用128.5MB。

我们来 展示10次并关闭10次这个视图之后 再来看看内存情况。

Memory增加到了157.9M,充分说明监听并没有被释放。

以下是重点

经过资料查询、实验之后,找到在UIView里正确释放监听者的方法如下:

展示10次并关闭10次这个视图之后的内存占用情况如下:

综上,得到结论,在VC没释放的情况下,UIView里要移除监听的方法是:

//移除通知方法'

- (void)willMoveToWindow:(UIWindow*)newWindow {

if(newWindow == nil) {

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

}

注:willMoveToWindow: 是一个系统方法,当view释放时,会被自动调用。

这个方法你学会了吗?

希望以上内容能对有需要的人有所帮助

欢迎大家一起探讨交流

请点击下方名片关注我们

邀各位IT大佬加入我们“西南名猿交流群”

全国程序猿皆可扫码上车噢~