I've been wondering if this was necessary for a while now. I remember reading that the need to copy is a [couple year old bug in clang](http://lists.apple.com/archives/objc-language/2012/Feb/msg00071.html).

In any case, I had a look at the assembly yesterday (using clang `Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)`). When adding a block to an array, the block is passed through `objc_retainBlock()`, which is currently just a shim for `Block_copy()`. When explicitly calling `-copy`, there is no call to `objc_retainBlock()`.