【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释放时,会被自动调用。
这个方法你学会了吗?
希望以上内容能对有需要的人有所帮助
欢迎大家一起探讨交流
请点击下方名片关注我们
诚 邀各位IT大佬加入我们“西南名猿交流群”
全国程序猿皆可扫码上车噢~
- 【技术分享】微服务开发的幸福感,是如何提升的?
- 【技术分享】强烈推荐小白必看的Java反射
- 【技术分享】高效编程之告别996基础篇
- 【技术分享】同源策略和跨域的简单理解
- 【技术分享】SSR解决方案探索
- 【技术分享】教你如何一键生成加密渠道包
- 【技术分享】如何解决开发中常见的跨域问题?
- 【技术分享】猪八戒网DevOps之Java组件安全检测
- 【Tips】如何在UIView中释放监听
- 前端权限验证控制与实现
- 教你用Java开发一个简单的JVM
- 如何利用ClickHouse搭建OLAP?
- 你必学的Vue.js的进阶教程
- 如何用Python Selenium Execl实现UI自动化
- 如何设计一款高性能分布式锁,实现数据的安全访问?
- 【技术分享】历经16年猪八戒网如何成功实现双活流量架构
- 编码风格不一,代码杂乱无章?5招解决你的痛点
- postman安全使用及变量设置
- VueJS异步与并发管理
- Jmeter工具之接口测试