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里增加了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释放时,会被自动调用。
这个方法你学会了吗?
希望以上内容能对有需要的人有所帮助
欢迎大家一起探讨交流