I'm reading Xcode's documentation, and here is something that puzzles me:
__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];
The following is copied from the documentation:
A block forms a strong reference to variables it captures. If you use
selfwithin a block, the block forms a strong reference toself, so ifselfalso has a strong reference to the block (which it typically does), a strong reference cycle results. To avoid the cycle, you need to create a weak (or__block) reference to self outside the block, as in the example above.
I don't understand what does 'a weak (or __block)' mean?
Is
__block typeof(self) tmpSelf = self;
and
__weak typeof(self) tmpSelf = self;
exactly the same here?
I found another piece in the document:
Note: In a garbage-collected environment, if you apply both
__weakand__blockmodifiers to a variable, then the block will not ensure that it is kept alive.
So, I'm totally puzzled.