快捷搜索:  汽车  科技

uiview数组怎么用?如何在UIView中释放监听

uiview数组怎么用?如何在UIView中释放监听[[NSNotificationCenter defaultCenter]removeObserver:]。当VC释放时必须得释放这个监听,不然就会有内存泄露的风险,使用释放方法:因为我咨询过5个搞ios研发的同事,没一人知道!哈哈哈哈哈!在代码编写中,我们使用通知的都知道,通知要先在VC中设置监听,用方法:[[NSNotificationCenter defaultCenter]addObserver:selector:name:object],

查看原文:【Tips】如何在UIView中释放监听

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


今天和大家分享一个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数组怎么用?如何在UIView中释放监听(1)

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

uiview数组怎么用?如何在UIView中释放监听(2)

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

uiview数组怎么用?如何在UIView中释放监听(3)

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

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

uiview数组怎么用?如何在UIView中释放监听(4)

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

以下是重点

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

uiview数组怎么用?如何在UIView中释放监听(5)

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

uiview数组怎么用?如何在UIView中释放监听(6)

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

//移除通知方法'

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

if(newWindow == nil) {

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

}

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

这个方法你学会了吗?

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

欢迎大家一起探讨交流

猜您喜欢: