Блок
A @synchronized(obj) { code }
фактически эквивалентен
NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
code
}
@finally {
[lock unlock];
}
хотя любой конкретный аспект этого на самом деле просто детали реализации. Но да, блок @synchronized
гарантированно снимает блокировку независимо от того, как управление выходит из блока.