You never actually start the capture session in the code that you have shown:
[captureSession startRunning];
Also, I would recommend that you look at the AVCam sample code that Apple has provided to see how they setup their capture session and preview layer. It contains some good tips regarding how to manage your capture session (they dispatch everything to a custom serial queue). For example, it contains these comments in the code:
// In general it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time.
// Why not do all of this on the main queue?
// -[AVCaptureSession startRunning] is a blocking call which can take a long time. We dispatch session setup to the sessionQueue so that the main queue isn't blocked (which keeps the UI responsive).