NSNotificationCenter管理

最近做项目遇到一个问题,本来以为是segue的问题,查了一下发现是NSNotificationCenter的问题

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'mapToBusLineVC'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'


当某个notification被post之后,观察者的方法被多次调用。于是想到,难道是多次添加了观察者,而没有删除?于是看了下苹果官方文档中的代码,发现官方例子中是在viewWillAppear的时候添加,viewWillDisappear的时候remove。

现在我们来深入思考下为什么不能在dealloc中调用[[NSNotificationCenter defaultCenter] removeObserver:self]。首先,让我们来想在添加观察者的时候,我们观察者的retainCount被+1了吗?如果没有被+1,那么当这个类会在retainCount为0时被销毁,通知中心就无法通知到该类,那么remove方法还有意义吗?所以在添加观察者的时候,通知中心必然会将该观察者的retainCount+1,既然通知中心retain了这个观察者,那么很不幸,这个观察者的dealloc方法永远不会被调用,他的retainCount最少也是1,因为通知中心retain了一次,结果[[NSNotificationCenter defaultCenter] removeObserver:self];就永远不被调用。

  所以正确的做法是按照官方例子中的方法来做。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值