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 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];
}];
}
The observer never gets removed and the statement is output every time the notification is sent out. Can anyone provide any guidance?
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__blockoutside and this should work.I’ve added an __weak to ensure there is no memory leak (as per Matt’s answer). Code not tested.