I want to share something about my misunderstanding about typeof.
The story goes from my pull request to mopub repo.
I found following code occurs in a block.
It seems not using weakSelf for weak-strong dance, but capturing self by the __typeof__(self).
__strong __typeof__(self) strongSelf = weakSelf;
So I create a pull request and change it to
__strong __typeof__(weakSelf) strongSelf = weakSelf;
In fact, my PR had a mistake. The typeof, __typeof and __typeof__ are compile-time flag. Thus self in this block is not retained.
Another thing is that, __typeof__(weakSelf) is not a good pattern.
This will carry __weak attribute, thus we need an explicit __strong attribute to overwrite it.
Thus using __typeof__(self) is better, to prevent accidentally creating a strongSelf which is actually not.