Throughout the code there are functions which need to be performed on the main thread, but still return a value (mostly in Contacts and Media, although there may be others). Now that we have blocks, we can instead use local variables with the __block specifier and TiThreadPerformOnMainThread to clean this up. Using the return cache leads (and has always led to) overretaining memory.
Blain's fix for TIMOB-1542 demonstrates a reasonable pattern for this, but rather than checking `[NSThread isMainThread]` and then calling back out to the function, we should instead be putting main thread critical sections within the block itself, i.e.
Note the retain/autorelease pattern being necessary, as if the block is performed on the main thread, it sets up its own autorelease pool and as a result may point back to a bad memory block.