iOS之建立通知、發送通知和移除通知的坑,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];}