Pet peeve: programmers thinking of weak references as meaning "do it correctly", and sprinkling them in without thinking about the implications
Weak references are relatively scary things to have in your code! In ObjC, your stuff using them might silently just do nothing. In Swift it's less silent (since you have to check the optional), but when I see people advocating for always capturing self weakly, it's clear that they are substituting """best practices""" for thought.
When the optimizer improved to be able to shorten lifetimes fully, TONS of code in the wild broke due to lurking misuse of weak references that had previously coincidentally not bitten them. The compiler team had to redesign the entire value lifetime system to accommodate.
There is no substitute for learning what weak references actually mean and then sitting down and thinking about your object graph. You cannot rule-of-thumb your way out of this.
Related pet peeve: calling everything under the sun a reference cycle. No, capturing self is not necessarily a reference cycle. No, memory leaks are not reference cycles. No, strong captures are not necessarily reference cycles. No, DispatchQueue.async cannot ever cause a reference cycle. Neither can DispatchQueue.sync. No, your random bug is probably not caused by a reference cycle. No, your crash is almost definitely not caused by a reference cycle (unless it's crashing due to running out of memory, then maybe).