关于NSNotificationCenter的一些见解

2017-08-22  本文已影响22人  流年划过颜夕

最近app中加了很多通知,但误用通知会导致方法多次调用等各种问题,为了研究透通知的处理机制,举了几个例子来讲解。
为了深入了解通知的处理机制,首先我们要明白控制器的生命周期(调用先后顺序如下):
载入完成,可以进行自定义数据以及动态的创建其他空间:

值得注意的是:
-(void)viewDidLoad 只会在控制器初始化时载入一次,
-(void)dealloc也只会在控制器销毁时载入一次.
而其他四个方法可以根据多个视图控制器切换时多次调用.
所以通知的业务逻辑可以根据以上进行合理的调度。
 
关于通知的注册和移除
有人喜欢方法一:

还有一些问题:
当在某个控制器不小心一次性注册几次通知:

-(void)viewDidLoad {

[super viewDidLoad];
[[NSNotificationCenter defaultCenter]      addObserver:self
                                              selector:@selector(father)
                                                  name:@"father"
                                                object:nil];
[[NSNotificationCenter defaultCenter]      addObserver:self
                                              selector:@selector(father)
                                                  name:@"father"
                                                object:nil];

}

你就可能会接收到同样多的信息:
2017-08-22 15:30:32.060 MyFrameWork[10504:299552] father
2017-08-22 15:30:33.172 MyFrameWork[10504:299552] father
但是移除通知只需要移除一次即可:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"father" object:nil];

另一方面,如果基类里面注册了通知,最好选择在基类的
-(void)viewDidLoad中注册。

其实会用通知后,开发就很方便了,特别是用于基于sokect的编程中,不断地和服务器进行交互,需要分发好服务器推送过来的信息,不然就可能造成信息错乱,内存异常等问题。

上一篇 下一篇

猜你喜欢

热点阅读