Besides the obvious differences:
enumerateObjectsUsingBlock
when you need both the index and the objectenumerateObjectsUsingBlock
when you need to modify local variablesIs enumerateObjectsUsingBlock
generally considered better or worse when for (id obj in myArray)
would also work? What are the advantages/disadvantages (for example is it more or less performant)?
Ultimately, use whichever pattern you want to use and comes more naturally in the context.
While for(... in ...)
is quite convenient and syntactically brief, enumerateObjectsUsingBlock:
has a number of features that may or may not prove interesting:
enumerateObjectsUsingBlock:
will be as fast or faster than fast enumeration (for(... in ...)
uses the NSFastEnumeration
support to implement enumeration). Fast enumeration requires translation from an internal representation to the representation for fast enumeration. There is overhead therein. Block-based enumeration allows the collection class to enumerate contents as quickly as the fastest traversal of the native storage format. Likely irrelevant for arrays, but it can be a huge difference for dictionaries.
"Don't use enumerateObjectsUsingBlock when you need to modify local variables" - not true; you can declare your locals as __block
and they'll be writable in the block.
enumerateObjectsWithOptions:usingBlock:
supports either concurrent or reverse enumeration.
with dictionaries, block based enumeration is the only way to retrieve the key and value simultaneously.
Personally, I use enumerateObjectsUsingBlock:
more often than for (... in ...)
, but - again - personal choice.