We came across this same crash recently, but it was slightly different to all the above cases I think, so hopefully this helps someone.
We were actually already using cellForItemAtIndexPath: rather than directly dequeuing a cell, but were calling the UICollectionViewDataSource's implementation in our viewController instead of directly on the UICollectionView, and so of course calling the data-source's method will in turn call dequeueReusableCell e.g.
[self collectionView:self.collectionView cellForItemAtIndexPath:indexPath];
instead of:
[self.collectionView cellForItemAtIndexPath:indexPath];
Changing to the latter fixed the issue.
Topic:
UI Frameworks
SubTopic:
UIKit