iOS这种观察者如何移除?

无敌鲨鱼炮
  • 448

下面这段添加观察者的代码:

// 键盘隐藏
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification
                                                  object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note)
 {
     // 更新约束
     [self.scrollView mas_updateConstraints:^(MASConstraintMaker *make) {
         make.bottom.mas_equalTo(self.view);
     }];
     [self.associationTableView mas_updateConstraints:^(MASConstraintMaker *make) {
         make.bottom.mas_equalTo(self.view);
     }];
 }];

如何移除添加的观察者?

我试了:

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

以及

[[NSNotificationCenter defaultCenter] removeObserver:_observer1 name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:_observer2 name:UIKeyboardWillHideNotification object:nil];

(_observer1_observer2addObserverForName方法的返回值)

上面两种方法都没有移除添加的观察者,导致视图控制器没走dealloc。

这种观察者该如何移除?

回复
阅读 3k
3 个回答
✓ 已被采纳

视图控制器没走dealloc不是没有移除观察者, 而是NSNotificationCenter这个对象方法 addObserverForName的block强引用self, 你改成弱引用试试.

keleBan
  • 5
新手上路,请多包涵

同意
Chris 的看法

这段代码是写在VC里边了吧?
应该是有内存泄漏吧?
VC有成功执行dealloc()吗?
解决办法:weak-strong dance

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏