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?
I find that in fact there is a memory leak unless the observer is marked both
__block
and__weak
. Use Instruments to make sure thatself
is not being overretained; I bet it is. This, however, works correctly (from my actual code):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.I've added an __weak to ensure there is no memory leak (as per Matt's answer). Code not tested.