Consider this:
id observer = [[NSNotificationCenter defaultCenter]
addObserverForName:MyNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[[NSNotificationCenter defaultCenter]
removeObserver:observer
name:MyNotification
object:nil
];
// do other stuff here...
}
];
I'm using this pattern to observe a notification once and then stop observing it. But LLVM tells me (under ARC) that Variable 'observer' is uninitialized when captured by block.
How can I fix this, since the block necessarily captures the variable before initialization, it being part of the initializer? Will using the __block
qualifier on observer
do the trick?
As explained in the answers to
Why doesn't Remove Observer from NSNotificationCenter:addObserverForName:usingBlock get called,
you have to
__block
, so that the block will refer to the initialized variable, AND__weak
, to avoid a retain cycle. (The latter applies only to ARC. Without ARC,
the block does not create a strong reference to a __block
variable.)Therefore:
__block __weak id observer = [[NSNotificationCenter defaultCenter] ...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With