iOS关于系统原生通知的实现

1. 设置通知中心 

  //通知中心 单例  (整个工程中只能有一个通知中心)
   
  
  NSNotificationCenter  * center =  [ NSNotificationCenter  defaultCenter ];
   
//    NSNotificationCenter * center2 = [[NSNotificationCenter alloc]init];
//    
//    NSLog(@"-----%@ , ======%@",center,center2);
   
   
  //发通知
   
   
  //NO1.   通知名字
   
  //NO2.   通知是谁发的  一般写self
   
  //NO3.   用户信息 传值的
    [center
  postNotificationName : @"changeColor"  object : self  userInfo :@{ @"color" : color}];

2. 在需要监听通知的视图中

 
  //监听通知
   
   
  //1. 先找到通知中心
   
   
  NSNotificationCenter  * center = [ NSNotificationCenter  defaultCenter ];
   
   
  //2.监听通知
   
  //NO1. Observer  观察者  监听者  self
   
  //NO2.  selector  监听到通知后 调用的方法
   
  //NO3.  监听到通知的名字  如果写 nil  会监听所有的通知
   
  //NO4.  指定监听到通知的来源 ,如果来源不对  也是不能监听的  一般写nil
   
   
  //self 监听  object 发送的名字作为changeColor 的通知  接到通知后 调用 receiveNotification: 方法
    [center
  addObserver : self  selector : @selector (receiveNotification:)  name : @"changeColor"  object : nil ];


//监听通知绑定的方法  带参数  是将接收的通知本身传过来 
-(
void )receiveNotification: ( NSNotification  *)notification
{
//获取  信息
   
  NSDictionary  * dic = notification . userInfo ;

然后可以在字典中或取监听到的内容

eg:
  
  self  . view  . backgroundColor  = [dic  objectForKey : @"color" ];


}

//在手动管理内存时  为防止 监听对象已经release  而通知中心仍然在给监听对象发通知  造成错误  需要监听对象在销毁之前 移除监听对象  即在监听对象所在的类中调dealloc方法 eg:

-(
void )dealloc
{

    [[
NSNotificationCenter  defaultCenter ] removeObserver : self ];

    [
super  dealloc ];
}

//批注:
//通知的实现原理 : 在通知中心  每一个通知的下边都有一个调度列表  ,调度列表中存放的是该通知的所有监听者  一旦发送通知  通知中心  就会让调度列表中的每一个对象  去调用他们相应的方法 从而是实现一对多的机制

//过渡释放的原因 :  如果一个监听者要销毁了 而此时  通知中心并不知道该监听者已经被销毁 当发送通知时 会仍然让该监听者去调用相应的方法 这时  程序就会崩溃  发生内存问题 . 所以如果一个监听对象将要销毁之前 需要去通知中心移除监听 ,将其从调度列表中删除

//需要在dealloc 方法中移除监听  否则程序就会崩溃
//批注2:
 
/*
     通知和代理都是OC中的一种回调机制 , 都可以实现值的反向传递
   
    区别: 1. 代理,  是一对一的  通知是一对多的 代理里面的协议方法 协议方法是可以有返回值的  (eg:  告       诉tableView 每一区有多少行).  监听到通知后绑定的方法 是不需要有返回值的
   
              2.  代理 ,定义协议方法的类和实现协议方法的类之间必须建立联系  实现协议方法中 必须包含定义协议方法的类的对象 (eg :  viewController中必须创建tableView 才能使用协议方法 );
   
                   通知 ,  两个类之间不需要建立任何的联系 ,
   
   
   
   
   
    */

延伸补充 : 如果在name出写空的话  会监听到系统的一些通知  可以再name位置调用系统的一些通知
eg:

 
  //监听应用程序已经进入后台时系统的通知
  
  // [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(receiveApplicationDidEnterBackgound:) name:UIApplicationDidEnterBackgroundNotification object:nil];
   
   
  //监听键盘frame 将要发生变化时的通知
    [[
NSNotificationCenter  defaultCenter ] addObserver : self  selector : @selector (receiveKeyboardWillChangeFrame:)  name : UIKeyboardWillChangeFrameNotification  object : nil ];

//监听到应用程序已经进入后台时调用的方法
-(
void )receiveApplicationDidEnterBackgound: ( NSNotification  *)notification
{
 
  //  NSLog(@"name -- %@",notification .name);
   

}
//监听键盘frame发生变化的通知  调用的方法
-(
void )receiveKeyboardWillChangeFrame: ( NSNotification  *)notification
{
   
  NSLog ( @"--------%@" ,notification. userInfo );


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值