Since we're talking about ARC, there is no `-retain`, only the [various runtime support functions](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime-support). Quoting the documentation for [`objc_retainBlock`](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-runtime-objc-retainblock):

> if the block pointed to by value is still on the stack, it is copied to the heap and the address of the copy is returned. Otherwise a retain operation is performed on the block exactly as if it had been sent the `retain` message.

If ARC didnt behave this way, then it would only be providing partial support for blocks. "Yeah we'll track reference counts for you, but only if you make sure the block is on the heap. Oh that's an implementation detail you're not supposed to know about? Just always copy then ok? If you don't we'll just pretend we don't know you."

Again, I'm cool to treat blocks as though they're `<NSCopying>` for semantics.