Дисклеймер: речь идёт об однопоточном коде, оставим ужасы параллельного исполнения за скобками. Также не рассматривается возможность overrelease.
Объект точно не ритейнится на время выполнения его метода, пруфы:
- http://clang.llvm.org/docs/AutomaticReferenceCounting.html#self
- https://gist.github.com/nikolaykasyanov/5a2c1fddb7dc5cafd6ea6050128e6c81
Нюанс: если в строке 48 использовать __weak вместо __unsafe_unretained, нода не разрушается внутри метода. Почему? Потому что доступ по __weak ссылке, в отличие от __unsafe_unretained, создаёт временную сильную ссылку (посредством вызова objc_loadWeakRetained).
Следовательно, пострадать в такой ситуациии можно только в случае, если сообщение объекту посылается через __unsafe_unretained ссылку. В Cocoa всё ещё есть такие делегаты, например.
Пока нет точной информации, ритейнится ли объект на время выполнения им метода.
Однако, вызов метода объекту через слабую ссылку (вроде self?.method()) можно "десахаризовать" так:
if let self = self { self.method() }Очевидно, что внутри скоупа существует сильная ссылка на self, следовательно, любой код в method не приведёт к преждевременному разрушению self.
Следовательно, независимо от того, ритейнится ли self методами, вызов метода через слабую ссылку безопасен.
Учитывая, как реализованы unowned-ссылки в Swift, они также безопасны с точки зрения разрушения объекта во время выполнения метода как и weak.
Однако, если Swift-объект используется в качестве делегата, и делегат объявлен как __unsafe_unretained, в принципе возможна та же ситуаиция, что и в Objective-C (источник не указан X дней).