美文网首页
带Block的NSNotification注意正确移除观察者的方

带Block的NSNotification注意正确移除观察者的方

作者: Leon1024 | 来源:发表于2018-12-08 00:25 被阅读0次

    NSNotification 的 observer 有两种类型:
    一种是不带block的,这类观察者iOS9.0后无需手动移除

    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationAction:) 
    name:@"TestNotification" object:nil];
    
    

    一种是带block的,这类观察者必须手动移除。而且这类观察者是和创建它的类(self)没有任何关联的。这类观察者只会强引用(持有)它的block。这类观察者如果不移除,会每个观察者都持有一个block。如果接收到通知,多个观察者都会调用该block。造成重复调用。所以,一定要用正确的姿势去移除该类观察者。首先是要将方法返回的观察者引用起来供移除的时候使用。如下是正确的操作方式:

     #import "ObserverVC.h"
    
    @interface ObserverVC ()
    @property (nonatomic, strong) id obser;
    @end
    
    @implementation ObserverVC
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
       // 这里一定要把返回的观察者引用起来,移除观察者的时候使用
        self.obser = [[NSNotificationCenter defaultCenter] addObserverForName:@"TestNotification" 
                                                             object:nil queue:[[NSOperationQueue alloc] init] 
                                                                   usingBlock:^(NSNotification * _Nonnull note) {
    
           NSLog(@">>>>收到通知>>>>");
    
        }];
    }
    
    - (void)dealloc
    {
        // 将引用起来的观察者移除,只有这种方式才能正确移除这类观察者.
        [[NSNotificationCenter defaultCenter] removeObserver:self.obser];
        
    }
    
    
    @end
    

    相关文章

      网友评论

          本文标题:带Block的NSNotification注意正确移除观察者的方

          本文链接:https://www.haomeiwen.com/subject/qbefhqtx.html