RetainCycles can occur when you are attempting to make sure your code employs proper ThreadSafety. Basically, what happens is that the first object retains the second object, and the second object retains the first object. So, neither will ever be released, which causes MemoryLeaks.
In case you're not sure just what exactly retaining is, we have information about RetainingAndReleasing and the RetainCount for you. If you're wondering exactly what a retain cycle is, see DirectedCycle.