Imitate UITableView reordering interaction
Technically this is not true recursion - dispatch_after(...) adds the block to whatever queue you assign it, so there's no chance of a stack overflow (although I'm not sure what will happen if you add too many blocks to the queue...)  The block is handled by GCD so there's no chance of a retain cycle either.  Plus, the block creation is inexpensive so it's not too inefficient (although the screen refreshes every 1/60 or ~0.017 seconds, so there is an inefficiency in having your timer interval at 0.0005s, about 33x faster than the refresh rate).  Overall, however, this method is very hacky and there is a more conventional way to do this, using a CADisplayLink.
Two pointers for you:

Refactor the code that actually does the scrolling into a new method, instead of having it all in one place.
Use a CADisplayLink to call that method, thus managing the scrolling behavior.

Can provide code example if necessary.
Food For Thought
Unless you are challenging yourself, optimizing existing technology, or doing some research, it's good practice in general to skip reinventing the wheel.  Why are you using a scroll view when you can get the functionality you desire, plus cell recycling and memory management for free with a UITableView?
In the context of your original question, I say it is far safer and more efficient to use technology that's already been proven to work.  For example, here's one I use a lot, that supports long-pressing to reorder :  https://github.com/hpique/HPReorderTableView