'should work'.. does sound like a confident response to me
but thanks for the info
i'll keep doing it the way i know works and the way instruments lets me know works.. i never use self inside STV action blocks
"Should work" was simply meant to be a polite turn of phrase, but if you're looking for something more definite...
There are two issues here. The first is the fallacy of NEVER using self inside of ANY block code. The second is understanding when retain cycles actually occur and what to do about them when that happens.
So, and again, to be clear and completely unambiguous: My last example is perfectly safe. The completion block is stored as a parameter to the function call. Self is captured as part of that process. Eventually, the block is executed, the scope dissolves, and the retained "self" is released.
Apple's example, however, illustrates what happens when you use "self" in a block AND you retain a reference to a block in the same object. In the words, using self by itself in a block doesn't create a retain cycle. Using self AND storing the block in the same object, however, does.
Which, as it turns out, is exactly what happens when you save a block in a STV Action array.
self.actions.didSomethingOrOther = ^{ [self doSomthing]; };
So in that case, you're correct. self shouldn't be used in a STV Action array and you need all of the weak self rigamarole. (Not to mention strong self, but that's another discussion.)
Which, by the way, isn't clear from most of the STV documentation. In fact, having to do all of that special handling obviates most of the simplicity gained from using blocks in the first place.
To sum up:
1) Don't use self in an action block.
2) Don't clutter the rest of your code (completion handlers, etc.) with weakself/strongself weakify/strongify unless it's needed.