There is a retain cycle, but it's temporary. The retain cycle looks like this:
self
retainsdispatchQ
dispatchQ
retains the block- the block retains
self
When the block returns, dispatchQ
releases it. At that point, the retain cycle is broken. The block is deallocated and releases self
.