Is holding a reference to the Coroutine returned by StartCoroutine necessary?

I've been seeing some odd hangs when loading from the cache via Caching.LoadFromCacheOrDownload that I've been trying to track down. I have the entire asset bundle loading system running in an infinite-looped Coroutine that services a queue. Periodically it will hang, I assume in the yield WWW. I noticed that StartCoroutine returns a Coroutine. I assume the reference is being held by the unity code. However if it were somehow getting collected that would explain why it seems to hang.

I changed the code to hold on to a reference to it and it seems to have fixed the problem or at least i haven't been able to repro yet. Oddly i haven't seen the hang when using plain old WWW that bypasses the cache.

I don't know what, specifically, you're referring to, but to answer your main question, no, you do not need to hold a reference to the Coroutine if you don't need it; it's not necessary at all, and it shouldn't be related to performance at all.

And I'm not sure having an infinitely-running coroutine is the best way to go about the download solution, though it depends on how you handle the coroutine. If you let it run every frame vs. every half second, it's going to take up more processing power.

It's hard to know what's going wrong without seeing any code, but holding onto the coroutine reference shouldn't be related to any kind of performance issues whatsoever, unless there's something you're doing in the code that you aren't telling us.