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
self
within a block, the block forms a strong reference toself
, so ifself
also 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
__weak
and__block
modifiers to a variable, then the block will not ensure that it is kept alive.
So, I'm totally puzzled.