Why doesn't Remove Observer from NSNotificationCenter:addObserverForName:usingBlock get called

前端 未结 2 1153
面向向阳花
面向向阳花 2020-12-05 15:56

I\'m confused on why the observer is never removed in the following code. In my viewDidAppear I have the following:

-(void)viewDidAppear:(BOOL)animated{

id         


        
相关标签:
2条回答
  • 2020-12-05 16:15

    When the block is pushed onto the stack by addObserverForName: the method has not yet returned so gpsObserver is nil (under ARC) or garbage/undefined (not under ARC). Declare the variable using __block outside and this should work.

    __block __weak id gpsObserver;
    
    gpsObserver = [[NSNotificationCenter defaultCenter] 
                              addObserverForName:FI_NOTES[kNotificationsGPSUpdated] 
                              object:nil 
                              queue:[NSOperationQueue mainQueue] 
                              usingBlock:^(NSNotification *note){
    
                                  NSLog(@"run once, and only once!");
    
                    [[NSNotificationCenter defaultCenter] removeObserver:gpsObserver];
    
            }];
    

    I've added an __weak to ensure there is no memory leak (as per Matt's answer). Code not tested.

    0 讨论(0)
  • 2020-12-05 16:23

    I find that in fact there is a memory leak unless the observer is marked both __block and __weak. Use Instruments to make sure that self is not being overretained; I bet it is. This, however, works correctly (from my actual code):

    __block __weak id observer = [[NSNotificationCenter defaultCenter] 
        addObserverForName:@"MyMandelbrotOperationFinished" 
        object:op queue:[NSOperationQueue mainQueue] 
        usingBlock:^(NSNotification *note) {
            // ... do stuff ...
            [[NSNotificationCenter defaultCenter] 
                removeObserver:observer 
                name:@"MyMandelbrotOperationFinished" 
                object:op];
    }];
    
    0 讨论(0)
提交回复
热议问题