iOS之创建通知、发送通知和移除通知的坑
1、创建通知,最好在viewDidLoad的方法中创建
- (void)viewDidLoad { [super viewDidLoad]; //创建通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" object:nil]; } //接收通知并相应的方法 - (void) tongzhi:(NSNotification *)notification{ NSDictionary *dic = notification.object; // NSLog(@"通知过来的 - dic = %@",notification.object); }
2、发送通知
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"324234",@"bankId",@"某某银行",@"bankName", nil]; //通过通知中心发送通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"tongzhi" object:dic];
3、移除通知,由那个控制器创建由那个控制器移除,谁创建谁移除,最好在dealloc方法中移除,如果通知不能及时的移除掉,当下次进入该控制器时会重复创建NSNotificationCenter,在对应方法中发送通知给上一次创建的通知,但是上一个通知所在的控制器已被干掉,所以这时候就会报错
-(void)dealloc{ //第一种方法.这里可以移除该控制器下的所有通知 // 移除当前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二种方法.这里可以移除该控制器下名称为tongzhi的通知 //移除名称为tongzhi的那个通知 NSLog(@"移除了名称为tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; }
这里注意:如果dealloc方法不调用,说明当前有变量没有被释放,这时如果找不到问题所在,也可以重写控制器的返回按钮backBarButtonItem事件,在返回的时候进行移除通知操作
//返回上一层界面事件 -(void)backPreviousViewControllerAction{ //第一种方法.这里可以移除该控制器下的所有通知 // 移除当前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二种方法.这里可以移除该控制器下名称为tongzhi的通知 //移除名称为tongzhi的那个通知 NSLog(@"移除了名称为tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; // 返回上一层界面 [self.navigationController popViewControllerAnimated:YES]; }