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