I’ve heard horror stories about reference counting performance cliffs caused by avalanche deallocations, which are hard to predict.
In the Objective-C era before automatic reference counting, you had these things called 'autorelease pools' which allow pretty straightforward control over deallocation. I think the same thing is still possible in ARC Obj-C and Swift.