@synchronized块是否保证释放锁?

Tod*_*orf 5 macos cocoa objective-c

假设这些是实例方法并被-run调用.

锁定时间是否被self释放-run

...
- (void)dangerous {
    @synchronized (self) {
        [NSException raise:@"foo" format:@"bar"];
    }
}

- (void)run {
    @try { [self dangerous]; }
    @catch (NSException *ignored) {}
}
...
Run Code Online (Sandbox Code Playgroud)

Lil*_*ard 10

@synchronized(obj) { code }块实际上等同于

NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
    code
}
@finally {
    [lock unlock];
}
Run Code Online (Sandbox Code Playgroud)

虽然这方面的任何特定方面实际上只是实现细节.但是,@synchronized无论控件如何退出块,都可以保证块释放锁定.