 <p>For simple enumeration, simply using fast enumeration (i.e. a <code>for…in…</code> loop) is the more idiomatic option. The block method might be marginally faster, but that doesn't matter much in most cases — few programs are CPU-bound, and even then it's rare that the loop itself rather than the computation inside will be a bottleneck.</p> <p>A simple loop also reads more clearly. Here's the boilerplate of the two versions:</p> <pre><code>for (id x in y){ } [y enumerateObjectsUsingBlock:^(id x, NSUInteger index, BOOL *stop){ }]; </code></pre> <p>Even if you add a variable to track the index, the simple loop is easier to read.</p> <p>So when you should use <code>enumerateObjectsUsingBlock:</code>? When you're storing a block to execute later or in multiple places. It's good for when you're actually using a block as a first-class function rather than an overwrought replacement for a loop body.</p>