博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中通知的添加和移除
阅读量:6880 次
发布时间:2019-06-27

本文共 1138 字,大约阅读时间需要 3 分钟。

我们都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用。很多时候我们根据自身需要将相关代码逻辑添加到这两个方法中。

现在随着手势操作的流行,很多人在页面中添加了左滑返回的功能,但是我们还是习惯性的把通知的移除放在了viewWillDisappear中,这样就会出现一个问题,如果我左滑滑到一半又滑回去了,这时候页面的通知已经移除了,整体的功能就会受到影响。

解决方法:

1、将注册通知的方法放到viewDidLoad中;只要页面有变化就会调用这个方法,页面的通知监听就会一直存在。

2、将移除通知的代码放到dealloc方法中,dealloc方法是在控制器销毁之时调用的。这个时候移除通知而不是在viewWillDisappear:方法中移除可以有效避免上述的问题。既然控制器都销毁了,那么还留着相关的通知干嘛?该移除的移除。

上面的两种解决方案,要说哪种最优,那肯定非第二种莫属了。

在这里可以举个例子。假如我们现在有这么个场景:在控制器的view上有个label,在label上添加一个手势(一般手势都是在创建完label之后添加的),假设我在viewWillDisappear:方法中移除该手势,则此时用户侧滑返回之时又取消侧滑返回,那么原先在label上的手势却再也添加不回来了(这里label一般在viewDidLoad方法中创建),因为viewDidLoad方法不会再次调用。而第二种方法却可以有效避免这种情况,这样就可以避免我这种“手贱”的任意捣鼓了,是不是很完美呢?

注意项:

用 [NSNotificationCenter defaultCenter] 发出的通知在控制器里面接收不用理会,控制器销毁的时候会自动释放不会野指针,但是在view里面接收通知的时候要在dealloc里面移除,否则会野指针。

总结:

1、iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法。2、在做手势和通知等一系列操作之时尽量在dealloc方法中执行,添加通知尽量在viewDidLoad等一次性方法中执行。3、在viewWillAppear:、viewWillDisappear:、viewDidAppear:、viewDidDisappear:等类似于这种会多次调用的系统方法中添加代码时,一定要多考虑业务逻辑,以免出现不必要的麻烦。复制代码

转载于:https://juejin.im/post/5a93c9446fb9a063517296f4

你可能感兴趣的文章
iOS App 主题切换
查看>>
用实验来说明lib的概念及链接方式
查看>>
我的友情链接
查看>>
快速排序思想及实现
查看>>
jQuery事件--- event.preventDefault() 取消点击动作的默认导航行为
查看>>
Android Log日志
查看>>
安装ubuntu系统 ——分区
查看>>
oracle学习_基本语法
查看>>
【Todo】STAR面试法
查看>>
信号量与条件变量的区别
查看>>
thinkphp3.1课程 1-1 为什么thinkphp在开发好后需要关掉开发模式
查看>>
Teradata 语句简单优化
查看>>
c# 通过关键字查询
查看>>
已知一个字符串S 以及长度为n的字符数组a,编写一个函数,统计a中每个字符在字符串中的出现次数...
查看>>
jquery
查看>>
伏地魔
查看>>
linux
查看>>
安装虚拟机-linux系统步骤
查看>>
python基础===monkeytype可以自动添加注释的模块!
查看>>
中序线索二叉树算法 解决 把二元查找树转变成排序的双向链表
查看>>