You should either consider using an existing game engine such as cocos-2d or take your time to refine your own engine using common patterns and best practices. If you decide to go with an existing engine there isn't much to say other than read their documentation and ask specific question if you get stuck. Don't ask questions about what engine to use. That kind of question isn't a good fit for Stack Overflow.
If you continue working on your own engine then I would still recommend that you study the documentation and programming guides for both cocos-2d and Sprite Kit. That will help you architecture your own engine. For example, this is an image from the Sprite Kit Programming Guide explaining the game loop.
If you are interested in writing a game engine using Core Animation then I would recommend that you read this series of blog posts by Matt Gallagher. It's a couple of years old but should still be mostly relevant.
When you have structured your game engine into these steps
- update (move things)
- action (respond to user interaction)
- simulate (collision detection)
- render
Then you can start to measure the performance and memory efficiency of the different steps and keep working on the heaviest piece until you reach acceptable performance.
Maybe it's worth reusing views when they move off screen, maybe your collision detection is too expensive and should be optimised, maybe moving to layers would be worth it. You have to measure first to know where to spend your time and effort.
However, I will tell you that you should drop the NSTimer(s) and use a single CADisplayLink for the game loop to keep the updates in sync with the display.
As a side note:
I don't know how often ARC collects garbage.
This sentence worries me. It shows that you have not understood what ARC is and how it works. ARC is not a garbage collector. I would advice you to go back and take a second look at memory management in Objective-C